2014-12-02 56 views
0

我有两个半依赖的python脚本。 ScriptA应该运行,即使ScriptB不是。相反,ScriptB只能在ScriptA运行时继续。使用shell子进程来确定第二个脚本是否仍在运行

我的想法是像

proc = subprocess.Popen(["ps aux | grep scriptA.py | wc -l"],shell=True,STDOUT=X) 

并以某种方式检查结果是2(因为这将是1,由于grep的)。

我收到2,当在python控制台中测试,但我努力保存标准输出。试图使用stdout=variable但失败。当我使用的是string子进程失败(与c2pwrite = stdout.fileno()),其使用int当它始终为0。

+1

对所有脚本使用pid文件:http://unix.stackexchange.com/questions/12815/what-are-pid-and-lock-files-for – Minos 2014-12-03 10:11:22

回答

2

你可以这样做:

import subprocess 

process = subprocess.Popen(['pgrep', 'scriptA.py'], stdout=subprocess.PIPE) 

process.wait() 

if not process.returncode: 
    print "Process running" 
else: 
    print "Process not running" 

在这里,我用p纤ep搜索的过程中,并检查它的返回代码,而不是它的输出。

如果要使用stdout,可以使用process.stdout。 这是一个像对象一样的文件。

+0

我喜欢它,但'stdout = open('/ dev/null','w'),stderr = subprocess.STDOUT'怎么样? – tdelaney 2014-12-02 16:26:25

+1

@tdelaney当然,如果你不关心输出,你可以将它重定向到/ dev/null。这不会更改返回码,上面的代码仍然可以工作。顺便说一句,'os.devnull'可以用来获得交叉平台文件路径。 – Fedalto 2014-12-02 16:48:07

+0

谢谢你的建议!我会尝试并报告结果! – 2014-12-03 07:24:15

1

为什么不使用Popen.poll()?如果它返回None,该过程尚未终止。如果它返回一个数字,它就是过程的退出代码。

+0

从python文档“检查子进程是否有终止”。然而ScriptA不是ScriptB的子进程,反正这个工作吗? – 2014-12-03 07:23:25

+0

ohboy ..我想我误解了你,你的意思是使用'Popen.poll()'在'ps aux | grep ScriptA.py'吧? – 2014-12-03 08:06:09