2017-03-07 6 views
1

Comment envoyer un Ctrl-C pour traiter ou tuer un processus avec des processus fils?Sous-processus python.Popen kill processus avec des processus enfants

Exemple de mon code (python 2.7):

# --*-- coding: utf-8 --*-- 
import subprocess 
import os 
import signal 

proc = subprocess.Popen(['ping localhost'],shell=True,stdout=subprocess.PIPE) 
print proc.pid 

a = raw_input() 
os.killpg(proc.pid, signal.SIGTERM) 

Je vois les processus suivants quand je lance le programme:

user 16078 0.0 0.0 4476 916 pts/6 S+ 14:41 0:00 /bin/sh -c ping localhost 
user 16079 0.0 0.0 8628 1908 pts/6 S+ 14:41 0:00 ping localhost 

sortie du programme:

16078 

Après raw_input:

Traceback (most recent call last): 
    File "subproc2.py", line 10, in <module> 
    os.killpg(proc.pid, signal.SIGTERM) 
OSError: [Errno 3] No such process 

Je veux tuer processus pid 16078 et pid 16079.

Comment puis-je faire et ce que le bug dans le programme? Appréciez l'aide.

Répondre

1

Comment ferais-je cela et quel est le bogue dans le programme?

Si vous souhaitez supprimer tous les processus qui incluent dans le groupe de processus, vous devez utiliser l'ID du processus parent. Comme ça:

os.killpg(os.getpid(), signal.SIGTERM) 

Si vous voulez tuer un seul processus enfant utilisez ceci:

os.kill(proc.pid, signal.SIGTERM) 
+0

Merci! L'erreur a disparu et le processus principal "/ bin/sh -c ping localhost" a été supprimé. Mais le processus "ping localhost" est resté. Est-il possible de tuer les deux processus? –

+0

Votre script avec ma correction va générer un seul processus "ping" et à la fin du programme, il sera tué. Tuez tous les processus ping et vérifiez à nouveau. –

+0

Merci! code "os.killpg (os.getpid(), signal.SIGTERM)" travaille pour moi! –