Crontab执行任务失败故障排除一例

八月 7th, 2013 发表评论 阅读评论

这两天在使用crontab执行脚本的时候发现,在shell下可以正常执行的脚本,到了crontab下怎么也无法正常执行。经过一天多查找原因,最终总结出两点:

1. crontab与shell运行环境不一样,最常见的导致失败的原因就是PATH变量不一致,网上说在脚本里面添加一行source ~/.profile(或者再加上source ~/.bashrc)可以解决问题,但是我试过不行,PATH里面还是少路径,最后只好吧shell下面的PATH原封不动的拷贝过来,在脚本开头设置一下PATH。

这样一来貌似是可以正常运行了,但是死活打印不出日志来。我之前在shell下运行的脚本是这样的:

nohup python2.7 manage.py celery worker -l info> worker_log.txt &

最终看了nohup的manpage发现:

2. nohup在shell下运行的时候会自动把stderr重定向到stdout,而在cron job中运行的时候不会重定向。因此脚本里只把stdout重定向到worker_log.txt是不够的,还需要加上2>&1,把stderr一并重定向过去。之前没有打印日志就是因为脚本的运行结果都是在stderr中,而shell下运行的时候被nohup自动重定向了。

到这里,我只想说,nohup真是坑爹啊!

 

分类: 标签: