CentOS系统消息推送实战技巧
小樊
34
2025-12-09 17:16:38
CentOS 系统消息推送实战技巧
一 场景化推送选型
- 本机终端即时广播:使用 wall 向所有已登录终端推送系统公告;适合维护窗口、紧急停机等场景。
- 指定用户私信:使用 write 用户名 定向提醒;配合 who/pts 定位在线会话;用 mesg n/y 控制是否接收消息。
- 图形桌面弹窗:使用 notify-send(依赖 libnotify/dbus),适合带 GUI 的运维终端或跳板机。
- 远程与留存:使用 mailx + SMTP 发邮件;或 curl + Webhook 推送到 Slack/Telegram/企业微信/钉钉 等,便于团队协同与审计留痕。
- 登录欢迎与动态 MOTD:编辑 /etc/motd 或 /etc/update-motd.d/ 脚本,登录即展示系统状态、公告与检查结果。
- 日志与故障预警:基于 rsyslog/journalctl 关键字(如 ERROR)触发告警;结合 cron 或 systemd 定时/事件驱动执行。
二 快速上手命令与最小可用配置
- 终端广播
- 直接广播:echo “【维护通知】今晚22:00-23:00进行系统维护,请保存工作后退出。” | wall
- 从文件广播:wall -f /tmp/custom_message.txt
- 指定用户私信与接收控制
- 查看在线用户与 TTY:who
- 发送私信:write alice pts/1
- 开关接收:mesg n(拒绝)/ mesg y(允许)
- 桌面通知
- 安装依赖:sudo yum install -y libnotify
- 发送弹窗:notify-send “【提醒】” “当前负载较高,请检查”
- 邮件通知(mailx + SMTP)
- 安装:sudo yum install -y mailx
- 配置 /etc/mail.rc(示例为 SMTP 登录)
- set smtp=smtp.yourmailserver.com
- set smtp-auth=login
- set smtp-auth-user=your_username
- set smtp-auth-password=your_password
- set from=“youremail@example.com”
- 发送:echo “【告警】磁盘剩余 10%” | mailx -s “磁盘告警” admin@example.com
- 第三方 Webhook(Slack/Telegram)
- Slack:curl -X POST -H ‘Content-type: application/json’ --data ‘{“text”:“【通知】CPU 使用率超过 90%”}’ https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
- Telegram:curl -s -X POST -H ‘Content-Type: application/json’ --data ‘{“chat_id”:“YOUR_CHAT_ID”,“text”:“【通知】服务器已重启”}’ https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage
- 登录欢迎与动态 MOTD
- 静态:echo “欢迎使用生产服务器,当前时间:$(date)” | sudo tee /etc/motd
- 动态:在 /etc/update-motd.d/ 下新增脚本(如 99-custom),赋予可执行权限,登录时自动渲染。
三 定时与事件驱动推送
- cron 定时
- 每天 09:00 桌面提醒:0 9 * * * /usr/bin/notify-send “【每日提醒】” “现在是早上 9 点”
- 每天 18:00 全站广播:0 18 * * * echo “【备份提醒】22:00 开始备份,请避免重要操作” | wall
- systemd 定时器(替代 cron,便于精确调度与日志)
- 服务单元 /etc/systemd/system/send-message.service
- [Unit] Description=Send a scheduled message
- [Service] ExecStart=/usr/bin/wall “【定时公告】按计划执行任务”
- 定时器单元 /etc/systemd/system/send-message.timer
- [Unit] Description=Run daily at 08:00
- [Timer] OnCalendar=--* 08:00:00; Persistent=true
- [Install] WantedBy=timers.target
- 生效:systemctl daemon-reload && systemctl enable --now send-message.timer
- 日志关键字触发(journalctl + 简单脚本防抖)
- 监控脚本 /usr/local/bin/log_error_notify.sh
- #!/usr/bin/env bash
set -uo pipefail
LOCK=/tmp/log_error_notify.lock
LOG=/var/log/messages
KEYWORD=“ERROR”
exec 200>“$LOCK”
flock -n 200 || exit 0
tail -n0 -F “$LOG” | while IFS= read -r line; do
if [[ “$line” == “$KEYWORD” ]]; then
echo “$line” | mailx -s “【日志告警】发现 $KEYWORD” admin@example.com
# 可选:桌面通知(在有 GUI 的会话)
# DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus notify-send “【日志告警】” “$line”
sleep 60 # 简单防抖,避免风暴
fi
done
- 定时执行:*/5 * * * * /usr/local/bin/log_error_notify.sh
- systemd 服务事件通知
- 在关键服务单元中添加:ExecStartPost=/usr/bin/notify-send “【服务状态】” “服务 your_service 已启动”
四 多渠道与集中告警方案
- 邮件 + Webhook 组合:本地 logger 写入日志,rsyslog 按级别转发到脚本,脚本同时 mailx 发邮件并 curl 推送到 Slack/企业微信/钉钉,实现“日志留痕 + 即时通知”。
- Prometheus + Alertmanager:定义告警规则(如 CPU > 90% 持续 1 分钟),Alertmanager 配置 email_configs 或 webhook_configs 多渠道分发,适合大规模与可视化运维。
- 消息中心化与权限:统一消息结构(如 timestamp/level/message/source),多端转发(邮件/短信/IM),并通过 RabbitMQ 权限或 Gotify 用户组控制可见范围。
五 稳定性与安全加固清单
- 防抖与节流:日志告警脚本加 文件锁/时间窗,避免短时间重复推送形成告警风暴。
- 身份与凭据:Webhook/SMTP 使用 专用账号与令牌,避免明文密码;限制来源 IP;启用 TLS/HTTPS。
- 可达性与代理:无公网环境使用 企业代理/内网 Webhook 网关;必要时为 cron 设置合适的 PATH 与代理环境变量。
- 日志与审计:为通知脚本与定时任务输出 stdout/stderr 至专用日志;定期清理与归档,防止 /var 分区撑满。
- 桌面会话识别:在有 GUI 的服务器上,向正确会话发送通知需设置 DISPLAY 与 DBUS_SESSION_BUS_ADDRESS(可从用户进程环境或 systemd --user 会话获取)。
- 频率控制:对周期性广播(如 wall)设置合理间隔;对监控告警采用 抑制/分组/升级 策略,减少噪声。