GNU/Linux >> Linux Esercitazione >  >> Linux

Come terminare un sottoprocesso Python avviato con shell=True

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.


Linux
  1. Come controllare l'utilizzo della memoria del processo con il comando pmap di Linux

  2. Come combinare la sostituzione del processo di Bash con Here-document?

  3. Come Dockerizzare le Applicazioni Python con Miniconda

  4. Come utilizzare l'esportazione con Python su Linux

  5. Come usare il comando `subprocess` con pipe

Come installare Flask con Python 3 su Ubuntu 18.04

Come eseguire un comando Shell con Python

Come lavorare con il processo in primo piano e in background in Linux

Come uccidere o terminare un processo Linux:la guida definitiva

Come installare Python 2.7 su CentOS 7.1 o 6.7 con Anaconda

Come installare Apache con Python Mod_wsgi su Debian 10