定制 CentOS 消息提醒的实用方案
一 通知渠道与适用场景
- 系统广播:使用 wall 向所有已登录终端推送即时消息,适合维护窗口、紧急通告。
- 邮件告警:通过 mail/mailx 或 Postfix 发送邮件,适合长期留痕与远程接收。
- 桌面弹窗:使用 notify-send(GNOME/桌面会话)做可视化提醒,适合本地登录用户。
- 日志与转发:用 rsyslog 记录与转发日志/告警,便于集中化监控与审计。
- 第三方 Webhook:对接 Slack/企业微信/钉钉 等,适合团队协作与统一告警通道。
二 快速上手 常用命令示例
- 系统广播
- 广播一条消息:sudo wall “系统将在5分钟后维护,请保存工作。”
- 邮件告警
- 安装工具:sudo yum install -y mailx
- 简单发送:echo “磁盘使用率超过80%” | mail -s “【告警】磁盘告警” admin@example.com
- 使用外部 SMTP(编辑 /etc/mail.rc,示例)
- set from=“alert@yourdomain.com”
- set smtp=smtp://smtp.yourserver.com:587
- set smtp-auth=login
- set smtp-auth-user=“alert@yourdomain.com”
- set smtp-auth-password=“YOURPASS”
- set ssl-verify=ignore
- set nss-config-dir=/etc/pki/nssdb
- 桌面弹窗
- 安装依赖:sudo yum install -y libnotify
- 发送弹窗:notify-send “标题” “这是一条桌面通知”
- 写入系统日志
- 记录告警:logger -t “ALERT” “CPU 使用率超过阈值”
三 进阶定制 日志转发与频率控制
- 日志转发到远程服务器(rsyslog)
- 编辑配置:在 /etc/rsyslog.conf 或 /etc/rsyslog.d/ 下添加
- 远程 UDP:. @192.0.2.10:514
- 远程 TCP:. @@192.0.2.10:514
- 应用:sudo systemctl restart rsyslog
- 按级别分离日志(示例)
- 将 authpriv 单独记录:authpriv.* /var/log/auth.log
- 调整主日志级别:*.info;authpriv.none;cron.none /var/log/messages
- 定时推送消息
- Cron:0 8 * * * /usr/bin/wall “每日8点例行通知”
- systemd 定时器(/etc/systemd/system/msg.timer)
- [Timer] OnCalendar=--* 08:00:00
- 启用:systemctl daemon-reload && systemctl enable --now msg.timer
- 邮件投递优化
- 使用 Postfix 作为 MTA 并配置 relayhost 提高可达性;注意邮件可投递性与反垃圾策略。
四 桌面环境通知与多用户场景
- GNOME 桌面通知策略
- 安装 dconf-editor:sudo yum install -y dconf-editor
- 路径:org → gnome → desktop → notifications,可调整应用通知的显示、声音与持续时间。
- VNC/X11 多会话弹窗
- 指定显示与用户:sudo -u alice DISPLAY=:1 notify-send “提醒” “来自后台的提示”
- 免密执行(visudo):alice ALL=(alice) NOPASSWD: /usr/bin/notify-send
- 注意:确保会话对应的 DISPLAY 与 DBus 可用(如安装 dbus-x11)。
五 实战模板 磁盘阈值告警脚本
- 功能:当根分区使用率超过阈值时,记录日志、发送邮件、并弹出桌面通知(在有 GUI 的会话上)。
- 用法:chmod +x disk_alert.sh;./disk_alert.sh 80
#!/usr/bin/env bash
set -Eeuo pipefail
THRESHOLD="${1:-80}"
PART="${2:-/}"
LOGFILE="/var/log/disk_alert.log"
SUBJECT="【磁盘告警】$(hostname): ${PART} 使用率过高"
MSG="在 $(date '+%F %T'),${PART} 使用率 ${USAGE}% ≥ ${THRESHOLD}%"
USAGE=$(df -hP "$PART" | awk 'NR==2 {gsub(/%/,"",$5); print $5}')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
logger -t "DISK_ALERT" "$MSG"
echo "$MSG" | mail -s "$SUBJECT" admin@example.com || true
for disp in :0 :1 :2; do
if sudo -u "$(who | awk -v d="$disp" '$5 ~ d {print $1; exit}')" \
DISPLAY="$disp" DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u "$(who | awk -v d="$disp" '$5 ~ d {print $1; exit}')")/bus" \
notify-send "磁盘告警" "$MSG" 2>/dev/null; then
break
fi
done 2>/dev/null || true
echo "$(date '+%F %T') $MSG" >> "$LOGFILE"
fi
提示
- 无公网或邮件投递受限时,优先使用 日志集中 与 企业 IM Webhook 作为兜底通道。
- 生产环境建议将告警脚本纳入 systemd 管理并设置 OnFailure 联动,确保可靠执行与告警链路可观测。