Verwenden Sie eine Prozessgruppe, um das Senden eines Signals an alle Prozesse in den Gruppen zu ermöglichen. Dazu sollten Sie eine Sitzungs-ID an den übergeordneten Prozess der erzeugten/untergeordneten Prozesse anhängen, was in Ihrem Fall eine Shell ist. Damit wird er zum Gruppenleiter der Prozesse. Wenn also jetzt ein Signal an den Leiter der Prozessgruppe gesendet wird, wird es an alle untergeordneten Prozesse dieser Gruppe gesendet.
Hier ist der 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()
beendet den Shell-Prozess und cmd
läuft noch.
Ich habe eine praktische Lösung gefunden, indem ich:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
Dies führt dazu, dass cmd den Shell-Prozess erbt, anstatt dass die Shell einen untergeordneten Prozess startet, der nicht beendet wird. p.pid
wird dann die ID Ihres cmd-Prozesses sein.
p.kill()
sollte funktionieren.
Ich weiß allerdings nicht, welche Auswirkungen das auf Ihre Pfeife haben wird.