怎样设置告警机制以监控定期清理任务的执行情况?
美国、香港服务器
怎样设置告警机制以监控定期清理任务的执行情况?
09-22 来源:
在 CentOS 7.6 中设置告警机制监控定期清理任务,核心是 **“任务状态检测 + 异常通知”**,可通过 邮件告警(简单通用)、脚本主动判断(灵活定制)或 监控工具集成(企业级场景)实现。以下是 3 种主流方案,从简单到复杂逐步说明,覆盖不同需求场景:
一、基础方案:邮件告警(简单通用,推荐入门)
通过系统自带的邮件工具(mailx),在清理脚本中添加 “状态判断逻辑”,当任务执行失败(如命令返回非 0 状态码)时,自动发送告警邮件到指定邮箱。
步骤 1:安装并配置邮件服务
CentOS 7.6 需先安装 postfix(邮件服务器)和 mailx(邮件客户端),并配置发件信息(以 QQ 邮箱为例,其他邮箱类似):
bash
# 1. 安装依赖
yum install -y postfix mailx
# 2. 启动 postfix 并设置开机自启
systemctl start postfix
systemctl enable postfix
# 3. 配置 mailx(编辑 /etc/mail.rc,添加发件人信息)
cat << EOF >> /etc/mail.rc
# 发件人邮箱(替换为你的邮箱,如 QQ 邮箱)
set from=123456@qq.com
# SMTP 服务器(QQ 邮箱 SMTP 为 smtp.qq.com,端口 25 或 465)
set smtp=smtp.qq.com:25
# SMTP 认证账号(同发件人邮箱)
set smtp-auth-user=123456@qq.com
# SMTP 授权码(非邮箱密码,需在邮箱设置中开启“SMTP 服务”并获取授权码)
set smtp-auth-password=abcdefghijklmnop
# 认证方式
set smtp-auth=login
# 跳过 SSL 证书验证(避免证书问题导致发送失败)
set ssl-verify=ignore
EOF
步骤 2:测试邮件发送是否正常
先手动测试邮件功能,确保能正常发送:
bash
# 发送测试邮件(主题为“Test Alert”,内容为“Hello”,接收邮箱替换为你的告警邮箱)
echo "This is a test alert from CentOS" | mail -s "CentOS Cleanup Task Test" admin@example.com
若接收邮箱收到邮件,说明邮件配置正常;若失败,检查 smtp 地址、端口、授权码是否正确。
步骤 3:在清理脚本中添加告警逻辑
修改之前的清理脚本(如 /usr/local/bin/system_cleanup.sh),在每个关键清理步骤后判断 “执行状态”,失败则发送告警:
bash
#!/bin/bash
# 清理脚本路径
SCRIPT_NAME="system_cleanup.sh"
# 日志文件(记录清理过程)
LOG_FILE="/var/log/system_cleanup.log"
# 告警接收邮箱(替换为你的邮箱)
ALERT_EMAIL="admin@example.com"
# 日志函数:统一记录时间和内容
log() {
echo "[$(date "+%Y-%m-%d %H:%M:%S")] $1" >> $LOG_FILE
}
# 告警函数:发送邮件告警
send_alert() {
local subject="CentOS 清理任务告警:$1"
local content="清理任务执行失败!\n任务名称:$SCRIPT_NAME\n失败步骤:$2\n日志路径:$LOG_FILE\n执行时间:$(date "+%Y-%m-%d %H:%M:%S")"
# 发送邮件(-s 主题,-e 启用转义字符)
echo -e "$content" | mail -s "$subject" $ALERT_EMAIL
log "已发送告警邮件至 $ALERT_EMAIL,失败原因:$2"
}
# -------------------------- 清理任务开始 --------------------------
log "===== 清理任务开始 ====="
# 记录清理前磁盘空间(便于对比效果)
df -h | grep -E "^/dev/" >> $LOG_FILE
# 1. 清理 yum 缓存(判断执行状态)
log "开始清理 yum 缓存..."
yum clean packages >> $LOG_FILE 2>&1
if [ $? -ne 0 ]; then # $? 为上一条命令的返回码,0 成功,非 0 失败
send_alert "yum 缓存清理失败" "yum clean packages 执行错误"
log "===== 清理任务因错误终止 ====="
exit 1 # 终止脚本,避免后续步骤继续执行
fi
# 2. 清理 /tmp 旧文件(判断是否删除成功)
log "开始清理 /tmp 旧文件(>7 天)..."
tmp_deleted=$(find /tmp -type f -mtime +7 -delete -print | wc -l) # -print 显示删除的文件,wc -l 统计数量
if [ $tmp_deleted -lt 0 ]; then # 异常情况(如权限不足导致无法删除)
send_alert "/tmp 清理异常" "无法删除 /tmp 下的旧文件,可能权限不足"
log "===== 清理任务因错误终止 ====="
exit 1
fi
log "成功删除 /tmp 下 $tmp_deleted 个旧文件"
# 3. 清理旧日志(类似判断逻辑)
log "开始清理旧日志文件(>30 天)..."
log_deleted=$(find /var/log -type f \( -name "*.log-*" -o -name "*.log.*" -o -name "*.gz" \) -mtime +30 -delete -print | wc -l)
if [ $log_deleted -lt 0 ]; then
send_alert "旧日志清理异常" "无法删除 /var/log 下的旧日志,可能权限不足"
log "===== 清理任务因错误终止 ====="
exit 1
fi
log "成功删除 $log_deleted 个旧日志文件"
# 4. 清理旧内核(保留最新 2 个)
log "开始清理旧内核..."
package-cleanup --oldkernels --count=2 -y >> $LOG_FILE 2>&1
if [ $? -ne 0 ]; then
send_alert "旧内核清理失败" "package-cleanup --oldkernels 执行错误"
log "===== 清理任务因错误终止 ====="
exit 1
fi
# -------------------------- 清理任务结束 --------------------------
# 记录清理后磁盘空间
log "--- 清理后磁盘空间 ---"
df -h | grep -E "^/dev/" >> $LOG_FILE
log "===== 清理任务成功完成 ====="
步骤 4:测试告警逻辑
手动模拟清理失败(如修改 yum clean packages 为错误命令 yum clean xxx),执行脚本后查看是否收到告警邮件:
bash
# 手动执行脚本
sudo /usr/local/bin/system_cleanup.sh
若收到 “yum 缓存清理失败” 的邮件,说明告警机制生效。
二、进阶方案:脚本主动监控任务执行(无邮件依赖)
若服务器无法连接外部 SMTP 服务器(如内网环境),可通过 “脚本定时检查清理日志”,将异常信息写入系统日志(/var/log/messages),或通过内网工具(如企业 IM 机器人)发送告警。
示例:检查清理日志,异常写入系统日志
创建监控脚本(monitor_cleanup.sh),定时检查清理日志中的 “失败” 关键词,发现异常则记录系统日志:
bash
#!/bin/bash
LOG_FILE="/var/log/system_cleanup.log"
# 检查最近 1 天的日志中是否有“失败”“错误”关键词
error_count=$(grep -iE "失败|错误" $(find $LOG_FILE -mtime -1))
if [ -n "$error_count" ]; then # 若存在错误记录
# 将异常信息写入系统日志(可通过 `journalctl -u rsyslog` 查看)
logger -p err "CentOS 清理任务异常:$error_count"
# (可选)若有内网 IM 机器人,可添加调用机器人 API 的命令,如钉钉/企业微信机器人
# curl -X POST -H "Content-Type: application/json" -d "{"msgtype":"text","text":{"content":"清理任务异常:"$error_count""}}" 机器人API地址
fi
设置定时检查(每小时检查一次)
bash
# 添加到 crontab
sudo crontab -e
# 添加以下内容(每小时第 10 分钟执行监控脚本)
10 * * * * /usr/local/bin/monitor_cleanup.sh
三、企业级方案:集成监控工具(Prometheus + Grafana 或 Zabbix)
若需监控多台服务器的清理任务,或需可视化展示执行状态、历史记录,可集成专业监控工具,以 Prometheus + Grafana 为例:
步骤 1:部署 Node Exporter(采集服务器指标)
Node Exporter 可采集系统日志、脚本执行状态等指标,部署后暴露给 Prometheus:
bash
# 下载 Node Exporter(版本可替换为最新)
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -zxvf node_exporter-1.8.2.linux-amd64.tar.gz
cd node_exporter-1.8.2.linux-amd64
# 启动 Node Exporter(监听 9100 端口)
nohup ./node_exporter --collector.logfile --logfile.directories="/var/log" &
步骤 2:配置 Prometheus 采集清理任务指标
在 Prometheus 配置文件(prometheus.yml)中添加 “清理日志采集规则”:
yaml
scrape_configs:
- job_name: "centos_cleanup"
static_configs:
- targets: ["你的服务器IP:9100"] # Node Exporter 地址
metrics_path: "/metrics"
relabel_configs:
- source_labels: [__address__]
regex: "(.*):9100"
target_label: instance
replacement: "$1"
步骤 3:Grafana 配置面板和告警
在 Grafana 中添加 Prometheus 数据源;
创建自定义面板,通过 “日志指标” 展示清理任务的 “成功次数”“失败次数”“释放空间大小”;
设置告警规则:当 “失败次数> 0” 或 “连续 2 次未执行清理任务” 时,触发告警(支持邮件、钉钉、Slack 等通知方式)。
四、告警机制的关键注意事项
避免告警风暴:设置 “告警抑制”(如同一错误 1 小时内只发送 1 次邮件),避免重复告警;
日志完整性:清理脚本的日志需包含 “时间、步骤、状态码、错误信息”,便于告警时定位问题;
权限问题:脚本和日志文件需用 root 权限执行(清理系统文件需 root),避免因权限不足导致清理失败但未触发告警;
测试验证:定期手动模拟失败场景(如修改脚本命令、删除日志文件),确认告警能正常触发。
总结
入门场景:优先选择 “邮件告警”,配置简单,适合单台服务器;
内网场景:用 “脚本监控 + 系统日志 / 内网 IM”,无需外部 SMTP 服务;
企业场景:集成 Prometheus + Grafana,支持多服务器监控和可视化,适合规模化运维。
通过以上方案,可实现对定期清理任务的 “全流程监控”,确保任务异常时能及时发现并处理。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快