Crontab 任务未启动... 有什么想法?
感谢你们帮我设置定时任务,crontab对我来说真是个宝藏。
不过我遇到一个问题,完全不知道是什么原因……基本上,有一个任务没有启动,而其他的任务都正常。我来解释一下。
这是我的定时任务列表:
*/10 * * * * python /webapps/foo/manage.py fetch_articles
*/10 * * * * python /webapps/bar/manage.py fetch_books
我把它们写在一个文件里,然后用crontab /path/to/file命令保存了。
我用crontab -l检查了一下,任务确实在那儿。
奇怪的是,其中一个任务每10分钟正常执行……但另一个却不执行。我试着手动输入命令,结果没有问题,正常运行。
有没有人有什么建议?
非常感谢大家的帮助!
更新:
我查看了系统日志文件,发现了这个:
Mar 5 02:50:01 localhost CRON[21652]: (root) CMD (python /webapps/foo/manage.py fetch_books)
这是不是说明crontab在正常调用这个任务?
谢谢大家的回复!
问题解决了!非常感谢大家!!
问题出在脚本静默失败,我觉得是因为脚本调用的路径导致PYTHON_PATH发生了变化……我不是很确定。
3 个回答
我觉得~unutbu的回答可能是对的,如果是第二个任务没有运行的话。
不过还有一个需要检查的地方,就是/webapps/bar/manage.py
是否需要独占某些资源,比如网络连接或临时文件等。因为你同时启动了两个进程,这可能会导致竞争条件的问题。
来自crontab手册的内容:
错误提示 虽然cron要求每一条crontab的记录最后都要有一个换行符, 但是无论是crontab命令还是cron服务都不会检测到这个错误。 结果是,crontab看起来会正常加载,但实际上命令根本不会执行。 最好的做法是确保你的crontab最后有一行空白。
(我强调的部分)。
Cron的运行环境总是和你想的不一样 :-)
我通常会这样设置我的定时任务:
*/10 * * * * ( date ; python /webapps/foo/manage.py fetch_articles ) >>/tmp/fetch.out 2>&1
这样可以确保有一些日志记录,方便我查看。
这可以帮助你缩小问题范围到以下两种情况:
- 如果临时文件没有出现,那就是cron的问题;
- 如果临时文件出现了,那就是你的脚本的问题。
在后者的情况下,希望能有一些输出可以让你调试。如果没有输出,那就需要在脚本中添加一些输出。
一种方法是在脚本的开头加上:
set -x
这样可以让所有的行在执行之前都输出出来。我的所有脚本通常都是这样开始的:
#!/bin/bash
#set -x
所以在调试的时候,我只需要取消注释第二行。