Utilizzare un gruppo di processi in modo da abilitare l'invio di un segnale a tutti i processi nei gruppi. Per questo, dovresti allegare un ID di sessione al processo genitore dei processi generati/figli, che è una shell nel tuo caso. Questo lo renderà il capogruppo dei processi. Quindi ora, quando un segnale viene inviato al leader del gruppo di processi, viene trasmesso a tutti i processi figli di questo gruppo.
Ecco il codice:
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()
finisce per terminare il processo della shell e cmd
è ancora in esecuzione.
Ho trovato una comoda soluzione a questo problema tramite:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
Ciò farà sì che cmd erediti il processo della shell, invece di fare in modo che la shell avvii un processo figlio, che non viene ucciso. p.pid
sarà allora l'id del tuo processo cmd.
p.kill()
dovrebbe funzionare.
Non so però che effetto avrà sulla tua pipa.