GNU/Linux >> Znalost Linux >  >> Linux

Zabíjení podprocesu spuštěného sudo v pythonu

Myslím, že jsem na to přišel, problém byl v tom, že kdybych to udělal

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))

zabilo by to proces, který spustil interpret pythonu

>>> Terminated

místo toho jsem nastavil preexec_fn do 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))

v jiném prostředí, pokud zkontroluji

pgrep sleep

nic se neobjeví, takže je ve skutečnosti zabit.


Měl jsem stejný problém s kořenovým podprocesem, ale odpovědi zde a zde - Python jak zabít kořenový podproces mi nefungovaly.

Na konci jediné, co fungovalo, bylo:

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

Bez potřeby preexec_fn=os.setpgrp


Když spustíte pgrep sleep zobrazí se vám PID sleep spuštěný jako podřízený příkaz sudo proces, který jste vytvořili.

Jako rychlou ukázku jsem uložil následující jako subproc.py :

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

Při spuštění tohoto skriptu můžeme vidět dva procesy vytvořené:

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

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

Všimnete si, že PID, o kterém víte ve svém kódu, je „rodičovský“ proces sudo. Toto je proces, který byste měli zabít, ale budete k tomu muset použít sudo:

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. Převod kódu Python 2 na Python 3

  2. Jak na to:Programování soketů v Pythonu

  3. Získejte ID podprocesu v Javě

  1. Jak uložit výsledek provedeného příkazu shellu do proměnné v pythonu?

  2. Jak zabít python skript pomocí bash skriptu

  3. Ukládání výsledku z gdallocationinfo jako proměnné v Pythonu

  1. Který proces má Pid 0?

  2. Instalace Pythonu 3.3.2?

  3. Nainstalujte python-novaclient na Windows