2014-12-02 27 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

相關問題