GNU/Linux >> Tutoriels Linux >  >> Linux

Comment terminer un sous-processus python lancé avec shell=True

Utilisez un groupe de processus afin de permettre l'envoi d'un signal à tous les processus des groupes. Pour cela, vous devez attacher un identifiant de session au processus parent des processus engendrés/enfants, qui est un shell dans votre cas. Cela en fera le chef de groupe des processus. Alors maintenant, lorsqu'un signal est envoyé au leader du groupe de processus, il est transmis à tous les processus enfants de ce groupe.

Voici le 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() finit par tuer le processus shell et cmd est toujours en cours d'exécution.

J'ai trouvé une solution pratique en :

p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)

Cela amènera cmd à hériter du processus shell, au lieu que le shell lance un processus enfant, qui ne sera pas tué. p.pid sera alors l'identifiant de votre processus cmd.

p.kill() devrait fonctionner.

Je ne sais pas quel effet cela aura sur votre pipe cependant.


Linux
  1. Comment gérer plusieurs versions de Python avec Pyenv sous Linux

  2. Comment combiner la substitution de processus de Bash avec Here-document ?

  3. Comment Kali gère la prochaine fin de vie de Python 2

  4. Comment utiliser la commande `subprocess` avec des pipes

  5. Comment terminer le processus de Python en utilisant pid?

Comment installer Flask avec Python 3 sur Ubuntu 18.04

Comment exécuter une commande Shell avec Python

Comment travailler avec le processus de premier plan et d'arrière-plan sous Linux

Comment tuer ou terminer un processus Linux :Le guide ultime

Comment installer Python 2.7 sur CentOS 7.1 ou 6.7 avec Anaconda

Comment installer Apache avec Python Mod_wsgi sur Debian 10