python popen管道的第一个进程无法被杀死

时间:2010-08-13 00:05:43

标签: python pipe kill popen zombie-process

我正在使用此代码

p1 = Popen(['rtmpdump'] + cmd_args.split(' '), stdout=PIPE)
p2 = Popen(player_cmd.split(' '), stdin=p1.stdout, stderr=PIPE)
p2.wait()
# try to kill rtmpdump
# FIXME: why is this not working ?
try:
    p2.stdin.close()
    p1.stdout.close()
    p1.kill()
except AttributeError:
    # if we use python 2.5
    from signal import SIGTERM, SIGKILL
    from os import kill
    kill(p1.pid, SIGKILL)

p1终止时,p2也会终止。

问题是:

如果我手动关闭p2(它是mplayer),rtmpdump / p1仍在运行。 我尝试了各种各样的东西,比如上面的东西,但我仍然无法杀死它。 我尝试添加close_fds=True

所以可能是rtmpdump仍然试图写入stdout。但为什么这会导致kill()失败?

完整源代码:http://github.com/solsticedhiver/arte-7.py

1 个答案:

答案 0 :(得分:0)

这是修复。在wait()之后调用kill()来真正杀死僵尸进程

# kill the zombie rtmpdump
try:
  p1.kill()
  p1.wait()
except AttributeError:
    # if we use python 2.5
    from signal import SIGKILL
    from os import kill, waitpid
    kill(p1.pid, SIGKILL)
    waitpid(p1.pid, 0)