2014-05-22 54 views
1

我有幾個可執行的C++二進制文件,我需要從一個python腳本啓動。根據這些可執行文件的狀態,該腳本將執行一些操作。比方說,我開始了4個獨立的程序,它們都在運行。我的腳本需要確保這4個程序運行愉快,並沒有崩潰。如果確實如此,腳本將發送一封電子郵件,其中包含「Process XYZ此時失敗」行中的信息。python - 從python啓動多個二進制文件並監視其狀態

我在Linux機器上。我嘗試過各種子過程技巧的組合,但沒有骰子。我想我可能需要利用線程,並在開始的進程上保留一個「看門狗」。理想情況下,腳本需要在單獨的終端窗口中啓動這些程序,因此總共有4個終端窗口。 下面是我的嘗試:

import subprocess as sp 
clear = sp.call('clear') 

try: 
    comm = sp.Popen(['xterm', '-e', '~/stuff/comm']) 
    while sp.Pipe == -1: 
     ...do stuff 
except sp.PIPE == -2: 
    ...send email. 

上述方法的問題一直是,如果我殺了腳本啓動的程序,該腳本並沒有意識到它被殺死。我會嘗試在後面添加更多連貫的信息,但如果任何人已經知道我正在嘗試完成什麼,我將不勝感激。

回答

1

由於您在Linux機器上,您可以使用信號,特別是SIGCHLD。當它的任何子進程死亡時,這個信號被髮送到父進程。默認操作是忽略它,因此您需要安裝處理程序來處理它:

import os 
import signal 

def sigchld(sig, frame): 
    (pid, r) = os.wait() 
    print pid, "exited with", ("signal %d" % (r & 0x7f) if os.WIFSIGNALED(r) else "exit code %d" % (r >> 8)) 

signal.signal(signal.SIGCHLD, sigchld) 
# run your subprocesses here