2016-09-20 5 views
1

execute_sleep.pyサブプロセスpopenの:信号が伝播しない

import os 
import time 
import subprocess 

sleep_script = 'sleep_forever.py' 
child = subprocess.Popen(sleep_script, 
         shell=True, 
         close_fds=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT, 
         ) 

subout = child.communicate()[0] 
print subout 
rc = child.returncode 

sleep_forever.pyは

#!/usr/bin/python 
import time 

while True: 
    time.sleep(1) 

私はexecute_sleep.pyを実行し、kill -TERM -- -<pid of execute_sleep.py>、 execute_sleep.pyは死ぬが、sleep_forever.pyを実行し続けます。

私は、execute_sleep.pyが信号を受け取ったときにsleep_forever.pyに伝播するようにするにはどうすればよいですか?

これらのオプションは信号をブロックしますか?

  • shell=True
  • close_fds=True
  • subprocess.PIPE

答えて

1

の使用あなたはそうあなたが孤児(sleep_scriptプロセス)を作成している、信号を処理する必要があります。したがって、親プロセスを終了させるシグナルがキャッチされると、前に子プロセスに伝播します。

def handler(signum, frame): 
    functionToKillSleeper(pidtokill) 


signal.signal(signal.SIGTERM, handler) 

SIGKILLは検出できないことに注意してください。

シグナルを処理するために、父親のプロセスをSIGINTまたはSIGTERMする必要があります。そうしないと、問題は残ります。

+0

シグナルを処理したくない(?)。私はちょうどそれが伝播したい。それは、処理される信号を受信して​​いないように見えます。親プロセスが明示的に信号をゲートダウンする必要があると言っていますか? -_- – ealeon

+0

はい、孤立した子プロセスを作成したので、それ以外の場合は伝播するために信号を処理する必要があります。プロセスは現在独立しているからです。 – Ilhicas

+1

オハイオ州私は、彼らが同じプロセスグループに属している(そして彼らが同じグループ、親プロセスと子プロセスにある)と思った場合、シグナルは自動的に伝搬されます。私は仮定が間違っていると思いますか? – ealeon

関連する問題