Python プログラムの終了時に、作成されたすべてのサブプロセスが終了するようにする方法はありますか? サブプロセスとは、subprocess.Popen() で作成されたサブプロセスを指します。
そうでない場合、発行されたすべての kill を反復処理してから kills -9 を実行する必要がありますか? もっとクリーンな方法はありますか?
ベストアンサー1
使用できます終了するこのため、プログラム終了時に実行されるクリーンアップ タスクを登録します。
atexit.register(関数[, *args[, **kargs]])
クリーンアップ プロセスでは、独自の待機を実装し、必要なタイムアウトが発生したときにそれを強制終了することもできます。
>>> import atexit
>>> import sys
>>> import time
>>>
>>>
>>>
>>> def cleanup():
... timeout_sec = 5
... for p in all_processes: # list of your processes
... p_sec = 0
... for second in range(timeout_sec):
... if p.poll() == None:
... time.sleep(1)
... p_sec += 1
... if p_sec >= timeout_sec:
... p.kill() # supported from python 2.6
... print 'cleaned up!'
...
>>>
>>> atexit.register(cleanup)
>>>
>>> sys.exit()
cleaned up!
注記-- このプロセス (親プロセス) が強制終了された場合、登録された関数は実行されません。
以下のWindowsメソッドは、Python >= 2.6では不要になりました。
Windowsでプロセスを強制終了する方法を紹介します。Popenオブジェクトにはpid属性があるので、次のように呼び出すことができます。成功 = win_kill(p.pid)(ニーズpywin32インストール済み):
def win_kill(pid):
'''kill a process by specified PID in windows'''
import win32api
import win32con
hProc = None
try:
hProc = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pid)
win32api.TerminateProcess(hProc, 0)
except Exception:
return False
finally:
if hProc != None:
hProc.Close()
return True