первый процесс python popen pipe не может быть убит - PullRequest
0 голосов
/ 13 августа 2010

Я использую этот код

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 все еще пытается записать в стандартный вывод. но почему это приводит к сбою kill ()?

полный исходный код: http://github.com/solsticedhiver/arte-7.py

1 Ответ

0 голосов
/ 08 апреля 2013

Вот исправление.позвоните 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)
...