1. ホーム
  2. python

Python プログラム終了時にサブプロセスを確実に終了させる

2023-11-01 18:56:57

質問

Pythonプログラムの終了時に、作成されたすべてのサブプロセスが死んでいることを確認する方法はありますか?サブプロセスによって、私はsubprocess.Popen()で作成されたものを意味します。

そうでない場合、発行されたkillのすべてを反復し、次にkill -9を行うべきでしょうか? 何かより良い方法はありますか?

どのように解決するのですか?

あなたは atexit を作成し、プログラムが終了したときに実行されるクリーンアップタスクを登録します。

atexit.register(func[, *args[, **kargs]])

クリーンアップ処理では、独自のwaitを実装し、任意のタイムアウトが発生したときにkillすることも可能です。

>>> 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!

注意 -- このプロセス(親プロセス)が強制終了した場合、登録された関数は実行されません。

Python >= 2.6では、以下のwindowsメソッドは不要になりました。

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