GNU/Linux >> Znalost Linux >  >> Linux

Jak ukončit podproces pythonu spuštěný s shell=True

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.


Linux
  1. Jak spravovat více verzí Pythonu pomocí Pyenv v systému Linux

  2. Jak zkombinovat substituci Bashova procesu s dokumentem Here?

  3. Jak Dockerize Python aplikací s Miniconda

  1. Jak zkontrolovat využití paměti procesu pomocí příkazu Linux pmap

  2. Jak se Kali vypořádá s nadcházejícím Python 2 End-of-Life

  3. Jak zabít <zaniklý> proces s rodičem 1

  1. Jak používat export s Pythonem na Linuxu

  2. Jak používat příkaz `subprocess` s rourami

  3. Jak ukončit proces z Pythonu pomocí pid?