Cron执行Python备份脚本出错时发送超50封邮件问题求助
问题根源分析
首先,咱们直接揪出最核心的问题——你的crontab配置写错了!
你当前的crontab执行规则是:
* 4 */3 * * /root/backup.py >/dev/null 2>&1
crontab的格式是「分 时 日 月 周」,这里第一个*代表每分钟都会执行一次脚本。也就是说,每3天的4点整到4点59分,你的脚本会被连续执行60次!
这就完美解释了你的现象:
- 出错时,每一次脚本执行都会触发异常,进而调用
sendMail发送邮件,所以你会收到50多封同一时间的邮件(对应4点到4点59分的多次执行); - 成功时,脚本执行完成速度快,可能后续重复执行时因为备份文件已存在(或
createArchive做了幂等处理)没有触发新的邮件,或者你只留意到了其中一封。
再看脚本本身的小细节:sendMail里的sent是函数局部变量,每次调用函数都会重置为0,这个判断其实起不到防止重复发送的作用,但这不是本次问题的核心——毕竟手动执行时只跑一次脚本,所以只会发一封;但cron每分钟跑一次,自然就会批量发邮件。
额外优化建议
虽然你已经修复了当前错误,可以再优化下脚本和配置的健壮性:
- 修正crontab规则为
0 4 */3 * * /root/backup.py >> /var/log/backup.log 2>&1,用0指定分钟(确保只在4点整执行一次),同时加日志输出方便排查问题; - 在
createArchive里添加文件锁机制,防止脚本被意外重复执行时产生冲突; - 删掉
sendMail里没用的sent变量,避免代码误解。
内容的提问来源于stack exchange,提问作者rflume
相关产品推荐
相关产品推荐

