Použijte skupinu procesů, abyste umožnili odeslání signálu všem procesům ve skupinách. Za tímto účelem byste měli připojit ID relace k nadřazenému procesu vytvořených/podřízených procesů, což je ve vašem případě shell. Tím se stane vedoucím skupiny procesů. Takže když je nyní signál vyslán vedoucímu procesní skupiny, je přenesen do všech podřízených procesů této skupiny.
Zde je kód:
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()
skončí zabitím procesu shellu a cmd
stále běží.
Našel jsem pohodlnou opravu:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
To způsobí, že cmd zdědí proces shellu, místo aby shell spustil podřízený proces, který se nezabije. p.pid
bude pak id vašeho procesu cmd.
p.kill()
by mělo fungovat.
Nevím, jaký to bude mít vliv na vaši dýmku.