`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.


하지만 한 가지 조언: 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)))

관련 정보