CentOS 系统消息推送策略
一 目标与总体架构
二 推送通道选型与配置要点
三 定时与频率控制
0 8 * * * /usr/bin/wall "..."。OnCalendar=*-*-* 08:00:00,Persistent=true。四 日志驱动的高可靠推送
*.* @192.0.2.10:514(UDP)或 *.* @@192.0.2.10:514(TCP);重启 systemctl restart rsyslog。服务器端启用 UDP/TCP 监听并配置存储模板。journalctl -f -u nginx 或 journalctl --since "5 min ago" 结合 grep 捕获关键字,触发 Webhook/邮件。五 实战最小配置示例
/usr/local/bin/alert.sh:#!/usr/bin/env bash
set -euo pipefail
WEBHOOK="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
STATE_FILE="/var/run/last_alert.err"
THROTTLE=900 # 15 minutes
ts() { date +%s; }
now() { ts; }
read last_ts < "$STATE_FILE" 2>/dev/null || last_ts=0
if (( now() - last_ts < THROTTLE )); then
exit 0
fi
if journalctl -b --since "5 min ago" -p err --no-pager | grep -q .; then
msg="[$(hostname)] $(date): ERROR found:\n$(journalctl -b --since "5 min ago" -p err --no-pager -q | tail -20)"
curl -s -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$msg\"}" "$WEBHOOK"
echo "$(now)" > "$STATE_FILE"
fi
chmod +x /usr/local/bin/alert.sh*/5 * * * * /usr/local/bin/alert.sh
/etc/systemd/system/daily-broadcast.service[Unit]
Description=Daily broadcast message
[Service]
Type=oneshot
ExecStart=/usr/bin/wall "【运维通告】今日巡检完成,系统运行正常。"
/etc/systemd/system/daily-broadcast.timer[Unit]
Description=Run daily broadcast at 08:00
[Timer]
OnCalendar=*-*-* 08:00:00
Persistent=true
Unit=daily-broadcast.service
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now daily-broadcast.timer
echo "$(journalctl -b --since "5 min ago" -p err --no-pager -q | tail -50)" \
| mail -s "[$(hostname)] ERROR 告警" ops@example.com