crontab:正在运行python脚本但不执行OS命令

时间:2013-08-27 22:51:30

标签: python linux crontab

我有这个crontab配置设置和以下脚本。

MAILTO="abc@avc.com"
41 15 * * * /usr/bin/python /home/atweb/Documents/opengrok/setup_and_restart.py >       /home/atweb/Documents/opengrok/restart_log.txt 2&>1

python脚本就是这个

import subprocess
import os
from time import gmtime, strftime


def main():
    print(strftime("%a, %d %b %Y %X +0000", gmtime()))
    print('Running opengrok index..')
    subprocess.call(["cd", "/home/atweb/Documents/opengrok"])
    subprocess.call(["./stop_website"])
    print('Stopped website...')
    subprocess.call(["./index_opengrok"])
    print('finished indexing...')
    subprocess.call(["./setup_opengrok"])
    print('setup finished...')
    subprocess.call(["./start_website"])
    print('Finished opengrok index..')

if  __name__ =='__main__':main()

这是输出日志

Tue, 27 Aug 2013 22:41:01 +0000
Running opengrok index..

由于某种原因,脚本已开始运行,但脚本的其他部分尚未完成。 我不确定它是OS故障还是cron故障或python。当我从命令行调用脚本时,脚本本身运行正常。

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:5)

您需要shell才能运行cd命令。在您的crontab中,将shbash定义为SHELL。

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="abc@avc.com" 
# m h dom mon dow   command
41 15 * * * /usr/bin/python /home/atweb/Documents/opengrok/setup_and_restart.py >       /home/atweb/Documents/opengrok/restart_log.txt 2&>1

或者在python中打开shell作为子进程。

答案 1 :(得分:1)

两件事:您的cd将设置该子流程的目录,该目录会立即退出:

subprocess.call(["cd", "/home/atweb/Documents/opengrok"])

换句话说,这是一个浪费的步骤。

下一个子流程对前一个环境一无所知:

subprocess.call(["./stop_website"])

...所以它无法运行。如果您希望所有程序都在该目录中运行,请使用:

os.chdir("/home/atweb/Documents/opengrok")
在任何subprocess.call()行之前