Utilisez un groupe de processus afin de permettre l'envoi d'un signal à tous les processus des groupes. Pour cela, vous devez attacher un identifiant de session au processus parent des processus engendrés/enfants, qui est un shell dans votre cas. Cela en fera le chef de groupe des processus. Alors maintenant, lorsqu'un signal est envoyé au leader du groupe de processus, il est transmis à tous les processus enfants de ce groupe.
Voici le code :
import os
import signal
import subprocess
# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,
shell=True, preexec_fn=os.setsid)
os.killpg(os.getpgid(pro.pid), signal.SIGTERM) # Send the signal to all the process groups
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()
p.kill()
finit par tuer le processus shell et cmd
est toujours en cours d'exécution.
J'ai trouvé une solution pratique en :
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
Cela amènera cmd à hériter du processus shell, au lieu que le shell lance un processus enfant, qui ne sera pas tué. p.pid
sera alors l'identifiant de votre processus cmd.
p.kill()
devrait fonctionner.
Je ne sais pas quel effet cela aura sur votre pipe cependant.