Utilice un grupo de procesos para habilitar el envío de una señal a todos los procesos de los grupos. Para eso, debe adjuntar una identificación de sesión al proceso principal de los procesos generados/secundarios, que es un shell en su caso. Esto lo convertirá en el grupo líder de los procesos. Ahora, cuando se envía una señal al líder del grupo de procesos, se transmite a todos los procesos secundarios de este grupo.
Aquí está el código:
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()
termina matando el proceso de shell y cmd
todavía se está ejecutando.
Encontré una solución conveniente para esto:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
Esto hará que cmd herede el proceso de shell, en lugar de que el shell inicie un proceso secundario, que no se elimina. p.pid
será la identificación de su proceso cmd entonces.
p.kill()
debería funcionar.
Sin embargo, no sé qué efecto tendrá esto en tu tubería.