如何记录 cron 定时任务的执行日志?
记录 cron 日志的核心:在命令尾部加 >> /path/to/logfile 2>&1 重定向输出到文件,配 logrotate 做轮转。也可用 logger 命令写入 syslog。
最基本的做法:在 crontab 的命令末尾加 >> /path/to/logfile 2>&1,把标准输出和标准错误都写入日志文件。再加 logrotate 防止日志无限增长。
方法一:输出重定向(最常用)
# 每天凌晨 2 点执行备份,日志写入文件
0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
>>追加写入(>是覆盖);2>&1把错误输出也合并到同一个文件。
建议在脚本内部打印时间戳,便于事后定位:
#!/bin/bash
echo "$(date '+%Y-%m-%d %H:%M:%S') 开始备份"
# ... 备份逻辑 ...
echo "$(date '+%Y-%m-%d %H:%M:%S') 备份完成"
方法二:写入 syslog
0 2 * * * /home/user/backup.sh 2>&1 | logger -t backup
logger -t backup 把输出打进 syslog(/var/log/syslog),标签为 backup,由 rsyslog 统一管理轮转。
方法三:logrotate 防止日志膨胀
# /etc/logrotate.d/backup
/var/log/backup.log {
daily
rotate 7
compress
missingok
notifempty
}
观测云对照
cron 日志写入文件后,观测云 DataKit 可以采集到平台统一检索;更重要的是可以配置监控器——当备份脚本输出 ERROR 或日志文件长时间没有新内容(说明任务没跑)时触发告警。
常见问题(FAQ)
Q:cron 本身有日志吗?
A:有。cron 守护进程的记录在 /var/log/syslog(Debian/Ubuntu)或 /var/log/cron(CentOS/RHEL)中,记录"什么时候执行了哪个任务",但不包含脚本输出。
Q:脚本没输出也没报错,但任务似乎没执行?
A:cron 环境变量极简(没有 PATH 等),脚本里要用命令的绝对路径;另外检查 % 字符需要转义为 \%。
Q:如何知道任务执行失败?
A:脚本内显式 echo "ERROR: ..." 并退出非零码,配合观测云监控器检测日志中的 ERROR 关键字或日志中断来触发告警。