Crontab执行Python脚本报错后未发邮件,求排查问题原因
首先得说,你的Shell脚本写法有致命错误,这是核心问题之一;另外Cron的邮件触发逻辑也需要理清,咱们一步步来:
1. Shell脚本的语法错误
你的script.sh第一行写成了:
#!/bin/sh /home/user/anaconda3/bin/python /home/user/script.py
这完全不符合shebang的规则。Shebang的格式是#!/path/to/interpreter,后面只能跟解释器的参数(比如#!/bin/sh -e),不能直接写要执行的命令。系统执行这个脚本时,会尝试用/bin/sh去运行/home/user/anaconda3/bin/python这个文件(把它当作Shell脚本),而不是调用Python去执行你的script.py——这直接导致脚本执行失败,甚至可能连错误输出都没有,Cron自然不会发邮件。
2. Cron的邮件触发逻辑
Cron只会在任务产生**标准输出(stdout)或标准错误(stderr)**时,才会给MAILTO指定的地址发邮件。如果你的脚本没正确执行到Python那一步,或者Python的异常输出没被传递到Cron的输出流里,就收不到邮件。
另外,你的Crontab里有两个相同时间的任务(10 15 * * *),虽然这不会直接导致邮件问题,但属于冗余配置,建议清理掉其中一个。
具体修复步骤
第一步:修正Shell脚本格式
把script.sh改成正确的写法:
#!/bin/sh # 调用Python脚本执行 /home/user/anaconda3/bin/python /home/user/script.py
这样系统会先用/bin/sh启动脚本,再执行后面的Python命令。
第二步:确保错误输出被Cron捕获
默认情况下Python的异常会输出到stderr,但为了保险,可以在Shell脚本里显式保留输出(或者同时写入日志):
#!/bin/sh # 把输出同时写入日志和留给Cron /home/user/anaconda3/bin/python /home/user/script.py >> /home/user/script_run.log 2>&1
如果不想写日志,直接保留默认输出即可:只要Python抛出异常,stderr会有内容,Cron就会触发邮件。
第三步:验证脚本权限和Cron邮件功能
- 给
script.sh添加执行权限:chmod +x /home/user/script.sh - 测试Cron邮件是否正常:比如在Crontab里加一个测试任务
* * * * * echo "test cron mail",等一分钟看是否能收到邮件。如果收不到,说明系统邮件服务(比如postfix/sendmail)没配置好,需要先排查这个。
第四步:查看Cron日志排查问题
可以查看Cron的日志文件(通常在/var/log/cron或/var/log/syslog),里面会记录任务是否被执行、执行时的错误信息,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者m33n

