GNU/Linux >> Linux の 問題 >  >> Linux

Pythonでsudoで開始されたサブプロセスを強制終了する

私はそれを理解したと思います、問題は私がこれをやった場合でした

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

Pythonインタープリターを開始したプロセスを強制終了します

>>> Terminated

代わりに、 preexec_fn を設定します 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))

チェックすると、別のシェルで

pgrep sleep

何も表示されないため、実際に殺されます。


ルート サブプロセスでも同じ問題がありましたが、こことここの回答 - Python でルート サブプロセスを強制終了する方法がうまくいきませんでした。

最後に唯一うまくいったのは:

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

preexec_fn=os.setpgrp

を必要としない

pgrep sleep を実行すると sleep の PID が表示されます sudo の子として実行されるコマンド

簡単なデモとして、以下を subproc.py として保存しました :

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

このスクリプトを実行すると、次の 2 つのプロセスが生成されていることがわかります。

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

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

コードで知っている PID が「親」の sudo プロセスであることがわかります。これは強制終了する必要があるプロセスですが、これを行うには 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. Python 3.3.2のインストール?

  2. 方法:Pythonでのソケットプログラミング

  3. Windowsにpython-novaclientをインストールします

  1. IIS7.5でPythonをセットアップする

  2. Linux プロセス管理用の Python ライブラリ

  3. shell=True で起動された Python サブプロセスを終了する方法

  1. Python から Linux コマンドを実行する

  2. pidを使用してPythonからプロセスを終了するには?

  3. bashスクリプトでpythonスクリプトを強制終了する方法