记crontab脚本未执行问题排查

问题描述

昨晚某个用python写的监控脚本上线,运维小伙伴电话告知手动执行结果正常,但用crontab无论如何也调不起来,脚本自己打的log也杳无音讯。

检查

  1. 首先就要看看crontab是怎么写的:
*/5 * * * * source /etc/profile; python /path/to/the/script.py >> /dev/null 2>&1
  1. 然后看看脚本是怎么写的(此处省略几百行,关注点如下):
logging.warning('some error message sending to syslog server')
os.system('echo "other local log" >> /path/to/**old**/script.log')

思路

  1. 上面这是什么鬼,本地log echo到绝对路径,而且路径居然还没改?

    • 告知小伙伴先别忙着改脚本,关注一下那个old/srcipt.log。然后得知log没有输出。
  2. Cron在执行脚本的时候,会把输出通过邮件发送给crontab的所有者,或者MAILTO环境变量指定的邮箱。但是此处居然很自信地将 stdout, stderr 都重定向到了/dev/null,邮件自然空空如也。

    • 修改重定向到/tmp/script.log,观察到输出:
      File "script.py", line 50
        finally:
              ^
    SyntaxError: invalid syntax
    
  3. 这又是哪跟哪?翻出来瞧瞧:

    try:
        f = open('file', 'r')
    except IOError, e:
        print >> sys.stderr, e
    else:
        somelist = f.readlines()
    finally:
        f.close()
    

对着这段代码看了足足5分钟……
有毛病吗?没毛病啊?是我眼睛有毛病了?

  1. 既然是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
  1. 记得服务器是RHEL 5.8,元配python 2.4.3,那么就是crontab默默地调用了/usr/bin/python

  2. 把crontab改成:

*/5 * * * * source /etc/profile; /usr/local/bin/python /path/to/the/script.py >> /dev/null 2>&1
脚本调起来了。

问题解决了,但还是没想明白 source /etc/profile 后为何会去用python2.4,待查。

posted @ 2016-05-13 00:48  轻哼  阅读(492)  评论(0)    收藏  举报