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

Beenden des sudo-gestarteten Unterprozesses in Python

Ich glaube, ich habe es herausgefunden, das Problem war, dass ich dies getan habe

import subprocess, os
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
pgid = os.getpgid(pr.pid)
subprocess.check_output("sudo kill {}".format(pgid))

es würde den Prozess beenden, der den Python-Interpreter gestartet hat

>>> Terminated

also setze ich stattdessen den preexec_fn bis os.setpgrp

import subprocess, os
pr = subprocess.Popen(["sudo", "sleep", "100"], preexec_fn=os.setpgrp)
print("Process spawned with PID: %s" % pr.pid)
pgid = os.getpgid(pr.pid)
subprocess.check_output("sudo kill {}".format(pgid))

in einer anderen Shell, wenn ich

überprüfe
pgrep sleep

es wird nichts angezeigt, also wird es tatsächlich getötet.


Ich hatte das gleiche Problem mit dem Root-Subprozess, aber die Antworten hier und hier - Python, wie man den Root-Subprozess beendet, haben bei mir nicht funktioniert.

Am Ende hat nur folgendes funktioniert:

proc = subprocess.Popen(["sudo", exe_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
.
.
.
os.system("sudo pkill -9 -P " + str(proc.pid))

Ohne die Notwendigkeit von preexec_fn=os.setpgrp


Wenn Sie pgrep sleep ausführen Ihnen wird die PID der sleep angezeigt Befehl, der als untergeordnetes Element von sudo ausgeführt wird Prozess, den Sie erstellt haben.

Als kurze Demo habe ich Folgendes als subproc.py gespeichert :

import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)

Wenn wir dieses Skript ausführen, sehen wir zwei erzeugte Prozesse:

~/$ python subproc.py
Process spawned with PID: 5296

~/$ ps all | grep sleep
    0  5296     1     sudo sleep 100
    0  5297  5296     sleep 100

Sie werden feststellen, dass die PID, die Sie in Ihrem Code kennen, der „übergeordnete“ sudo-Prozess ist. Dies ist der Prozess, den Sie beenden sollten, aber dazu müssen Sie sudo verwenden:

subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)

Linux
  1. Konvertieren Ihres Python 2-Codes in Python 3

  2. Welcher Prozess hat Pid 0?

  3. Python 3.3.2-Installation?

  4. Installieren Sie python-novaclient unter Windows

  5. Richten Sie Python unter IIS 7.5 ein

So installieren Sie Python 3 unter Windows 10

Installieren Sie Python 3 auf Redhat 8

So überprüfen Sie die Python-Version

Python if..else-Anweisung

Wie speichere ich das Ergebnis eines ausgeführten Shell-Befehls in einer Variablen in Python?

Speichern des Ergebnisses von gdallocationinfo als Variable in Python