记crontab脚本未执行问题排查
问题描述
昨晚某个用python写的监控脚本上线,运维小伙伴电话告知手动执行结果正常,但用crontab无论如何也调不起来,脚本自己打的log也杳无音讯。
检查
- 首先就要看看crontab是怎么写的:
*/5 * * * * source /etc/profile; python /path/to/the/script.py >> /dev/null 2>&1
- 然后看看脚本是怎么写的(此处省略几百行,关注点如下):
logging.warning('some error message sending to syslog server')
os.system('echo "other local log" >> /path/to/**old**/script.log')
思路
-
上面这是什么鬼,本地log echo到绝对路径,而且路径居然还没改?
- 告知小伙伴先别忙着改脚本,关注一下那个old/srcipt.log。然后得知log没有输出。
-
Cron在执行脚本的时候,会把输出通过邮件发送给crontab的所有者,或者MAILTO环境变量指定的邮箱。但是此处居然很自信地将 stdout, stderr 都重定向到了/dev/null,邮件自然空空如也。
- 修改重定向到/tmp/script.log,观察到输出:
File "script.py", line 50 finally: ^ SyntaxError: invalid syntax -
这又是哪跟哪?翻出来瞧瞧:
try: f = open('file', 'r') except IOError, e: print >> sys.stderr, e else: somelist = f.readlines() finally: f.close()
对着这段代码看了足足5分钟……
有毛病吗?没毛病啊?是我眼睛有毛病了?
-
既然是finally这有语法错误,那就滚回去翻翻文档吧。还好我有服务器上Python 2.5对应的老文档。
Changed in version 2.5: In previous versions of Python, try...except...finally did not work. try...except had to be nested in try...finally.
Python 2.5 开始支持except跟finally同级,之前版本except要嵌套在try...finally里面。如此说来,难道是版本问题?
# python --version
python 2.5.x
# which python
/usr/local/bin/python
-
记得服务器是RHEL 5.8,元配python 2.4.3,那么就是crontab默默地调用了/usr/bin/python
-
把crontab改成:
*/5 * * * * source /etc/profile; /usr/local/bin/python /path/to/the/script.py >> /dev/null 2>&1
脚本调起来了。
附
问题解决了,但还是没想明白 source /etc/profile 后为何会去用python2.4,待查。

浙公网安备 33010602011771号