python-subprocess-callback-when-cmd-exits私は別のスレッドでサブプロセスを実行しています。サブプロセスが完了した後、呼び出し可能オブジェクトが実行されます。しかし、問題は、スレッドをデーモンとして実行しても、プログラムが正常に終了した後でもサブプロセスが実行され続けるか、またはkill -9
、Ctrl + Cなどで殺された場合です...プログラム出口のスレッドで実行中のサブプロセスを終了する
以下は非常に簡単な例(2.7上で実行):
import threading
import subprocess
import time
import sys
def on_exit(pid):
print 'Process with pid %s ended' % pid
def popen_with_callback(cmd):
def run_in_thread(command):
proc = subprocess.Popen(
command,
shell=False
)
proc.wait()
on_exit(proc.pid)
return
thread = threading.Thread(target=run_in_thread, args=([cmd]))
thread.daemon = True
thread.start()
return thread
if __name__ == '__main__':
popen_with_callback(
[
"bash",
"-c",
"for ((i=0;i<%s;i=i+1)); do echo $i; sleep 1; done" % sys.argv[1]
])
time.sleep(5)
print 'program ended'
メインスレッドはサブプロセスすべてがうまくあるよりも長く続く場合:
(venv)~/Desktop|➤➤ python testing_threads.py 3
> 0
> 1
> 2
> Process with pid 26303 ended
> program ended
メインスレッドがサブプロセスよりも少ない持続した場合、サブプロセスはし続け最終的にハングアップするまで実行します。
(venv)~/Desktop|➤➤ python testing_threads.py 8
> 0
> 1
> 2
> 3
> 4
> program ended
(venv)~/Desktop|➤➤ 5
> 6
> 7
# hanging from now on
メインプログラムが終了したり終了した場合、サブプロセスを終了するにはどうすればよいですか?私はatexit.register(os.kill(proc.pid, signal.SIGTERM))
をproc.wait
の直前で使用しようとしましたが、メインスレッドスレッドが終了したときではなく、サブプロセスを実行しているスレッドが終了したときに実際に実行されます。
私は親のPIDについてもポーリングを考えていましたが、proc.wait
の状況のために実装する方法がわかりません。
最適な結果は次のようになります。
(venv)~/Desktop|➤➤ python testing_threads.py 8
> 0
> 1
> 2
> 3
> 4
> program ended
> Process with pid 1234 ended