2013-08-27 52 views
4

我有这个crontab配置设置和下面的脚本。crontab:python脚本正在运行但不执行操作系统命令

MAILTO="[email protected]" 
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.. 

出于某种原因,剧本已经开始运行,但剧本的其他部分都没有完了。 我不确定它的操作系统故障或cron故障或python。当我从命令行调用脚本时,脚本本身运行良好。

有谁知道为什么会发生这种情况?

+0

而不是重定向,尝试从脚本内打开(或追加)文件打开文件?这对我来说非常类似的应用程序。嗯,请检查您的最终重定向...应该是'2>&1'而不是'2&> 1' – beroe

+1

试着寻找这个答案,看看它是否是你的同样的问题,http://stackoverflow.com/a/16646206/2714534 – blakev

回答

4

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

SHELL=/bin/sh 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO="[email protected]" 
# 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 

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

1

两件事情:你cd将设置该目录为子,这将立即退出:

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

换句话说,这是一个死不瞑目。

下一个子不知道前面一个人的环境中任何事物:

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

...所以它不能运行。如果你想所有的程序在该目录中运行,使用方法:

os.chdir("/home/atweb/Documents/opengrok") 

之前任何subprocess.call()线。

相关问题