2017-07-27 14 views
0

Popenでサブプロセスを起動していますが、終了することを期待しています。しかし、プロセスが終了しないだけでなく、それにsigkillを送信すると、まだ生き残っています!私にとってPopenの子プロセスはなぜ死んでいないのですか?

from subprocess import Popen 
import os 
import time 
import signal 

command = ["python","--version"] 

process = Popen(command) 
pid = process.pid 

time.sleep(5) #ample time to finish 

print pid 

print "Sending sigkill" 
os.kill(pid,signal.SIGKILL) 

try: 
    #Kill with signal 0 just checks whether process exists 
    os.kill(pid,0) 
    print "Process still alive immediately after (not so bad...)!" 
except Exception as e: 
    print "Succeeded in terminating child quickly!" 

time.sleep(20) #Give it ample time to die 

#Kill with signal 0 just checks whether process exists 
try: 
    os.kill(pid,0) 
    print "Process still alive! That's bad!" 
except Exception as e: 
    print "Succeeded in terminating child!" 

、この版画::以下は実証スクリプトがある

77881 
Python 2.7.10 
Sending sigkill 
Process still alive immediately after (not so bad...)! 
Process still alive! That's bad! 

だけでなく、このスクリプトは、それが終了しているはずの後に子供がまだ生きているが、私はpsを使用できることを確認することができます印刷されているプロセスIDに、それがまだ存在することがわかります。奇妙なことに、psはプロセス名を(Python)(かっこに注意してください)と表示します。

+1

なぜ、 'process.terminate()'はありませんか? – zwer

+2

ゾンビのプロセスです。あなたが['os.wait()'](https://docs.python.org/2/library/os.html#os.wait)を呼び出すまでそれは消えません。 – Kevin

+0

@ケビン:うん、それだった!これを回答として投稿すると、私はそれを選択します。 – augray

答えて

2

process.wait()に電話するか、signal.signal(signal.SIGCHLD, signal.SIG_IGN)を1回送信する必要があります。子供を待つ予定がないことを示します。前者は移植可能です。後者はUnix上でしか動作しません(しかしPOSIX-standardです)。これらのことをどちらもしない場合、Unixではプロセスはゾンビとしてぶら下がります.Windows has a similar behavior if you keep the process handle open

関連する問題