linux定时任务监控需主动反馈状态:每个任务记录退出码并用标记文件标识运行/完成/失败状态,再通过独立查岗脚本每5分钟检查超时、缺失done文件、failed内容及日志时效性,异常时发送含主机名、任务名、时间、退出码和日志尾行的精准告警。

Linux 定时任务本身不反馈执行结果,监控异常不能只靠“有没有日志”或“cron 是否在运行”,关键得看任务是否真正成功完成。核心思路是:让每个任务主动“说话”,再用独立脚本定期“查岗”。
给每个定时任务加状态出口
别依赖 cron 自带的日志(它只记录调度动作,不反映脚本成败)。应在 crontab 条目末尾统一重定向并记录退出码:
* * * * * /path/to/backup.sh >> /var/log/backup.log 2>&1; echo "EXIT:$?" >> /var/log/backup.log- 在
backup.sh开头加上set -e,确保任意命令失败立即退出;或对关键步骤(如rsync、mysqldump)后手动检查$?,失败时exit 1 - 日志按天轮转,用
logrotate配置,避免单个文件过大
用标记文件确认“是否跑完”
退出码只能说明“是否出错”,但无法判断“是否卡住”或“是否被重复触发”。引入轻量级状态文件机制:
- 脚本开头:
touch /tmp/.backup.running - 成功结束前:
mv /tmp/.backup.running /tmp/.backup.done.$(date +%Y%m%d) - 失败时:
echo "$(date): $ERROR_MSG" > /tmp/.backup.failed,并保留.running文件便于识别挂起 - 标记文件名带日期后缀,方便追溯某天是否执行
写一个“查岗脚本”每5分钟扫一遍
单独写一个监控脚本(比如 /usr/local/bin/check-backup.sh),由 cron 每5分钟触发一次:
- 检查
/tmp/.backup.running是否存在且超过30分钟(说明任务卡死) - 检查最新
.backup.done.20260612是否存在(当天应有 done 文件) - 检查
.backup.failed是否非空,读取最后一行错误信息 - 检查
/var/log/backup.log最后一条时间戳是否在2小时内(防静默失败)
异常时发告警,内容必须可定位
告警不是通知“出错了”,而是帮人5秒内知道“哪里错、怎么查”:
- 邮件或企微消息里必须含:主机名、任务名(backup_db)、最后尝试时间、退出码、log 尾行(
tail -n1 /var/log/backup.log) - 用
mail -s "ALERT: backup_db failed on $(hostname)" admin@example.com或调用企业微信 webhook 发送结构化文本 - 所有告警同时追加到统一日志
/var/log/backup-alert.log,便于回溯
不复杂但容易忽略











