EC2实例中Cron日志显示任务运行但实际失败,如何排查及记录错误?
确认Cron任务执行状态与记录错误的方法
1. 给Cron任务添加日志重定向
/var/log/cron只记录任务是否触发,不会保存执行结果和错误信息。直接修改Cron任务,把标准输出和错误输出重定向到指定日志文件:
0 2 * * * /home/ec2-user/scripts/backup.sh >> /home/ec2-user/scripts/logs/backup.log 2>&1 0 3 * * 0 /home/ec2-user/scripts/cleanup.sh >> /home/ec2-user/scripts/logs/cleanup.log 2>&1 0 * * * * /home/ec2-user/scripts/health_check.sh >> /home/ec2-user/scripts/logs/health_check.log 2>&1
先提前创建日志目录,避免写入失败:
mkdir -p /home/ec2-user/scripts/logs chown ec2-user:ec2-user /home/ec2-user/scripts/logs
之后直接查看对应日志文件,就能明确任务执行是否成功,以及失败的具体原因。
2. 查看Cron自动发送的邮件通知
Cron会把任务执行失败的信息发送到用户本地邮箱,用以下命令查看:
如果任务返回非0的退出码,邮件里会包含完整的错误详情。要是想指定外部接收邮箱或者禁用邮件通知,在Cron文件顶部添加:
# 指定接收邮箱 MAILTO="your-email@example.com" # 或者禁用邮件 MAILTO=""
3. 在脚本内部添加错误处理与日志
给shell脚本(比如cleanup.sh)添加日志记录和错误捕获逻辑,能更细致地追踪执行过程:
#!/bin/bash LOG_FILE="/home/ec2-user/scripts/logs/cleanup_detail.log" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行cleanup脚本" >> $LOG_FILE # 执行Python脚本并捕获所有输出 python3 /home/ec2-user/scripts/worker_script.py >> $LOG_FILE 2>&1 EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] cleanup脚本执行失败,退出码:$EXIT_CODE" >> $LOG_FILE exit $EXIT_CODE else echo "[$(date '+%Y-%m-%d %H:%M:%S')] cleanup脚本执行成功" >> $LOG_FILE fi
4. 针对cleanup.sh连接失败的额外排查
你手动执行时遇到RabbitMQ连接拒绝错误,还需要确认:
- RabbitMQ服务是否正常运行:
systemctl status rabbitmq-server - 如果只有Cron执行时失败,大概率是Cron的环境变量和用户登录环境不一致(比如PATH缺失、Python路径不对)。可以在Cron任务开头指定完整环境变量,或者在脚本里用绝对路径调用Python:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0 3 * * 0 /home/ec2-user/scripts/cleanup.sh >> /home/ec2-user/scripts/logs/cleanup.log 2>&1
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

