2015-12-09 59 views
0

我注意到,有時python不會在Popen和完成腳本之後終止子進程。如果腳本完成,子進程(由Popen提供)有時不想死。

代碼:

proc = subprocess.Popen([blablabla_dir + 'blablabla'], 
         stdin=None, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, 
         cwd = None, 
         env = {'LD_LIBRARY_PATH': blablabla_dir + 'lib'}) 
raise Exception() 

結果:

... 
    raise Exception() 
Exception 

但有時我:

$ ps aux | grep blablabla 
symonen+ 2413 0.0 0.1 158572 11988 ?  Sl 19:04 0:00 /home/qqq/dev/eee/build/debug/blablabla 
symonen+ 2591 0.0 0.0 18636 944 pts/12 S+ 19:04 0:00 grep --color=auto blablabla 

因此,我們有:如果蟒蛇 「有時間」,關閉過程(後拋出異常)然後處理完成。如果沒有,那麼沒有完成

所以問題:是存在的方式,使力殺死完成腳本後,所有子進程(例如,一些選項來運行腳本或其他一些方式)。我正在爲我的應用程序進行一些測試,並且在完成測試腳本後不想在系統中產生垃圾。

我指的只是Pyhon的一些方法。所以就像「從布什腳本運行腳本,然後從布什腳本中殺死所有垃圾」 - 不適合。

從我發送到所有創建的進程信號(15或9)是不好的方法。更準確地說,它是一種選擇,但它不能完全解決問題。當然,我通過信號關閉了我的應用程序。但是:如果在發送kill之前我們有未處理的異常,那麼腳本完成後我們將再次產生垃圾。

回答

0

我有一個設計理念,可以幫助你解決你的問題。我們將使用一個spawner python腳本來運行spawn python腳本。每個spawn腳本運行一個進程並將進程id(pid)返回給spawner。 spawner在spawn腳本運行時被阻塞,一旦spawn腳本完成或失敗,spawner會創建一個調用來終止它收到的pid。

一些示例代碼:

產卵

import shlex 
import subprocess 
import re 

if __name__ == "__main__": 

    # Use shlex to make sure your arguments are parsed correctly 
    # Here we have the command to run a spawn script 
    args = shlex.split("python spawn.py") 

    # Run the spawn script 
    proc = subprocess.Popen(args, 
          stdout=subprocess.PIPE) 

    # Waits for the spawn script to close and receives the output 
    spawn_stdout, spawn_err = proc.communicate() 

    # Go through the output to find the id of the process spawn started 
    match = re.findall(r'(?<=PROCESS_ID)[\d]+?(?=END)', spawn_stdout) 

    if len(match) > 0: 
     kill = subprocess.Popen("kill {}".format(match[0]), 
           stdout=subprocess.PIPE, 
           shell=True) 

菌種

import subprocess 

# We start the process 
proc = subprocess.Popen([blablabla_dir + 'blablabla'], 
        stderr=None, 
        stdout=None) 

# After it starts, print a unique string containing the process id 
print "PROCESS_ID{}END".format(proc.pid) 

這是一個有限的設計,我相信你會搗鼓有了它,我只想在那裏得到想法。希望能幫助到你!

0

當程序結束時,不要期望子進程被殺死。當翻譯員關閉時,subprocess和「python」都不會這樣做。

正確的方法做到這一點是捕獲異常,並kill你的孩子的過程,做一個finally塊等。

如果你關心你的腳本,你可能會衍生出其他任何進程想要殺掉整個進程組


在Linux上,你亦可以利用​​和prctl(2),以確保您的孩子殺死自己當他們的父母去世一個非常複雜的解決方案。 (爲什麼* nix術語總是如此令人毛骨悚然?;-))

+0

好主意(prctl + PR_SET_PDEATHSIG)。非常感謝你。 –

+0

現在我找到了關於此的正確主題:http://stackoverflow.com/questions/1884941/killing-the-child-processes-with-the-parent-process謝謝。 –

+0

如果我在我的過程中將PR_SET_PDEATHSIG設置爲SIGTERM,是否存在一些背面效應?通常它將作爲守護進程工作,也可以在不守護進程模式下從bash(帶有導出庫)調用。 –

相關問題