GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So beenden Sie einen Python-Unterprozess, der mit Shell=True gestartet wurde

Verwenden Sie eine Prozessgruppe, um das Senden eines Signals an alle Prozesse in den Gruppen zu ermöglichen. Dazu sollten Sie eine Sitzungs-ID an den übergeordneten Prozess der erzeugten/untergeordneten Prozesse anhängen, was in Ihrem Fall eine Shell ist. Damit wird er zum Gruppenleiter der Prozesse. Wenn also jetzt ein Signal an den Leiter der Prozessgruppe gesendet wird, wird es an alle untergeordneten Prozesse dieser Gruppe gesendet.

Hier ist der 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() beendet den Shell-Prozess und cmd läuft noch.

Ich habe eine praktische Lösung gefunden, indem ich:

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

Dies führt dazu, dass cmd den Shell-Prozess erbt, anstatt dass die Shell einen untergeordneten Prozess startet, der nicht beendet wird. p.pid wird dann die ID Ihres cmd-Prozesses sein.

p.kill() sollte funktionieren.

Ich weiß allerdings nicht, welche Auswirkungen das auf Ihre Pfeife haben wird.


Linux
  1. So verwalten Sie mehrere Python-Versionen mit Pyenv unter Linux

  2. Wie kombiniere ich die Prozesssubstitution von Bash mit dem Here-Dokument?

  3. So Dockerisieren Sie Python-Anwendungen mit Miniconda

  4. Wie Kali mit dem bevorstehenden Python 2 End-of-Life umgeht

  5. Wie beendet man den Prozess von Python mit PID?

So installieren Sie Flask mit Python 3 unter Ubuntu 18.04

So führen Sie einen Shell-Befehl mit Python aus

So arbeiten Sie mit Vordergrund- und Hintergrundprozessen unter Linux

So beenden oder beenden Sie einen Linux-Prozess:Der ultimative Leitfaden

So installieren Sie Python 2.7 unter CentOS 7.1 oder 6.7 mit Anaconda

So installieren Sie Apache mit Python Mod_wsgi unter Debian 10