2012-12-04 77 views
2

我有一個大腳本設計來運行一個任務,一次。但是我有一個init腳本,它使用start-stop-daemon在任何時候殺死腳本。該腳本結束很好,但子流程命令運行直到它完成。我懷疑它可能只是一個問題,我如何試圖做全局變量。或者,我使用communicate與子進程。無論如何這裏的代碼相關的東西:蟒蛇殺子進程通信退出

import subprocess 
import os 
import signal 

pro = '' 

def sigHandler(signum, frame): 
    global pro 
    os.killpg(pro.pid, signal.SIGTERM) 
    sys.exit() 

def run(data): 
    #I found an example using preexec_fn somewhere on stackoverflow. Cant 
    #remember if they were using .communicate() or not 
    global pro 
    pro = subprocess.Popen(command, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setsid).communicate() 
    return(1) 

if __name__ == '__main__': 
    signal.signal(signal.SIGTERM, sigHandler) 
    while True: 
     run(relevantData) 
+0

看來,直到子進程已經完成了可變親沒有得到數據。所以當sigterm在子進程運行時運行時,不會有pid數據被殺死。這可能是communic()的一個特性。我想用wait()來代替,但是我用命令的輸出來解決緩衝區問題。 – ryan461

回答

0

朋友幫我弄明白了。正如我在評論中所說的,親們在命令運行時沒有被填充。於是,我只好我的代碼改成這樣:

,然後它的工作:)