2016-12-06 29 views
1

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 

答えて

0

使用Thread.join方法、このスレッドが終了するまでブロックメインスレッド:

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] 
     ]).join() 
    print 'program ended' 
関連する問題