GNU/Linux >> Belajar Linux >  >> Linux

Membunuh subproses yang dimulai sudo dengan python

Saya rasa saya sudah menemukan jawabannya, masalahnya adalah jika saya melakukan ini

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

itu akan mematikan proses yang memulai juru bahasa python

>>> Terminated

jadi sebagai gantinya, saya mengatur preexec_fn ke 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))

di shell lain, jika saya centang

pgrep sleep

tidak ada yang muncul, sehingga benar-benar dibunuh.


Saya memiliki masalah yang sama dengan subproses root tetapi jawabannya di sini dan di sini- Python cara membunuh subproses root tidak bekerja untuk saya.

Pada akhirnya satu-satunya hal yang berhasil adalah:

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

Tanpa perlu preexec_fn=os.setpgrp


Saat Anda menjalankan pgrep sleep Anda diperlihatkan PID dari sleep perintah, dijalankan sebagai turunan dari sudo proses yang Anda buat.

Sebagai demo cepat, saya menyimpan yang berikut ini sebagai subproc.py :

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

Saat menjalankan skrip ini, kita dapat melihat dua proses muncul:

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

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

Anda akan melihat bahwa PID yang Anda ketahui dalam kode Anda adalah proses sudo 'induk'. Ini adalah proses yang harus Anda hentikan, tetapi Anda harus menggunakan sudo untuk melakukannya:

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. Proses Yang Memiliki Pid 0?

  2. Instal python-novaclient di Windows

  3. Siapkan Python di IIS 7.5

  1. Pustaka Python untuk manajemen proses Linux

  2. Cara menghentikan subproses python yang diluncurkan dengan Shell=True

  3. Bagaimana cara menyimpan hasil dari perintah Shell yang dieksekusi dalam variabel dengan python?

  1. Mengonversi kode Python 2 Anda ke Python 3

  2. Instalasi Python 3.3.2?

  3. Cara:Pemrograman Socket dengan Python