ソフトウェアテストの一環として、プログラム/コマンドを実行するシナリオを考えていますsudo
。これらのコマンドはモジュールベースのPythonスクリプトで実行されますsubprocess
。私はスーパーユーザー権限でテストスイート全体を実行しないようにしています。
この例では、次のように仮定します。top
。私のコマンドはそれ自体のいくつかのサブプロセスを開始し、デッドロックが発生する可能性があります。タイムアウト後、その項目(およびその子)を終了したいと思います。確実な解決策は、私のコマンドを新しいセッション/プロセスグループのリーダーにして、そのコマンドとそのサブプロセスをすぐに終了できるようにすることです。sudo
私の場合は例外なく常にパスワードで保護されており、可能であればそうしたいとsudo
思います。
- 働く:
setsid top
- 動作しますが、新しいプロセスグループを作成しません。
sudo setsid top
- 問題がある - 安全な方法でルートパスワードを取得するのは難しいです。
setsid sudo top
私は(3)をきちんと作業できませんでした。私は台無しだったSUDO_ASKPASS
。
驚くべきことに、(2)は実際に実行されましたが、必要な新しいプロセスグループを提供しませんでした.
systemd─┬─ ...
├─kdeinit5─┬─ ...
│ └─yakuake─┬─2*[bash]
│ ├─bash───sudo───top
│ ├─bash───pstree
...
ベストアンサー1
シナリオ2は、以下を使用せずに次のように変更できますsetsid
。
sudo -b command
これにより、システムのinitプロセスの直下にこのコマンドを含む新しいプロセスグループが作成されますsudo
。
ただし、1つのアドバイス:Pythonを使用してこのようなプロセスグループを起動すると、subprocess.Popen
結果オブジェクトPID
()は最終的に使用されるモードをsubprocess.Popen(...).pid
決定するために使用できません。たとえば、新しく作成されたのではなく、Pythonインタプリタを終了するプロセス))。私の回避策(必須):PGID
kill -9 -- -{PGID}
psutil
import os
import psutil
import subprocess
def __get_pid__(cmd_line_list):
for pid in psutil.pids():
proc = psutil.Process(pid)
if cmd_line_list == proc.cmdline():
return proc.pid
return None
cmd = ['sudo', '-b', 'command']
cmd_proc = subprocess.Popen(cmd)
print('Wrong PGID: %d' % os.getpgid(cmd_proc.pid))
print('Right PGID: %d' % os.getpgid(__get_pid__(cmd)))