`sudo setidコマンド`は新しいプロセスグループを作成しませんか?

`sudo setidコマンド`は新しいプロセスグループを作成しませんか?

ソフトウェアテストの一環として、プログラム/コマンドを実行するシナリオを考えていますsudo。これらのコマンドはモジュールベースのPythonスクリプトで実行されますsubprocess。私はスーパーユーザー権限でテストスイート全体を実行しないようにしています。

この例では、次のように仮定します。top。私のコマンドはそれ自体のいくつかのサブプロセスを開始し、デッドロックが発生する可能性があります。タイムアウト後、その項目(およびその子)を終了したいと思います。確実な解決策は、私のコマンドを新しいセッション/プロセスグループのリーダーにして、そのコマンドとそのサブプロセスをすぐに終了できるようにすることです。sudo私の場合は例外なく常にパスワードで保護されており、可能であればそうしたいとsudo思います。

  1. 働く:setsid top
  2. 動作しますが、新しいプロセスグループを作成しません。sudo setsid top
  3. 問題がある - 安全な方法でルートパスワードを取得するのは難しいです。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インタプリタを終了するプロセス))。私の回避策(必須):PGIDkill -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)))

おすすめ記事