2010-08-13 38 views
0

J'utilise ce codepremier processus de conduite de popen python ne peut pas être tué

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) 

quand p1 se termine alors p2 est terminée aussi.

Le problème est:

Si je fermer manuellement p2 (il est mplayer), rtmpdump/p1 est toujours en cours d'exécution. J'ai essayé différentes choses comme ce qui est en haut mais je ne peux toujours pas le tuer. j'ai essayé avec l'ajout close_fds=True.

donc peut-être que rtmpdump essaie toujours d'écrire sur stdout. mais pourquoi cette cause tue-t-elle()?

code source complet: http://github.com/solsticedhiver/arte-7.py

+0

Comment 'kill()' échec? – habnabit

+0

Il ne tue tout simplement pas le processus. Mais pas d'erreur ou d'exception. J'utilisais seulement 'pgrep rtmp' pour s'occuper de ce processus mais en fait, il est dans l'état . Vous cherchez de l'aide sur le processus défunt, j'ai trouvé que l'appel du système d'attente est nécessaire pour ces processus ?? Par chance, j'ai essayé d'ajouter un p1.wait() et cela fonctionne maintenant. à savoir rtmpdump est vraiment tué et essayer: p1.kill() p1.wait() attente avant kill ne fonctionne pas. Je ne comprends pas comment l'attente est supposée fonctionner après la mort, mais c'est le cas. – solsTiCe

+0

@solsTiCe: Cela aurait été bien si vous aviez répondu à votre propre question au lieu de l'éditer. Maintenant, d'autres trouvent votre question encore et encore, lors de la recherche de vieilles questions sans réponses. Pouvez-vous le faire? Puis marquez cette réponse comme acceptée. – Anthon

Répondre

0

Voici le correctif. appeler wait() après kill() pour tuer vraiment le processus zombie

# 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)