Sudo
sudo setsid command
不會產生新的程序組?
我正在研究一個我想在
sudo
軟體測試中執行程序/命令的場景。這些命令是從基於subprocess
模組的 Python 腳本啟動的。我試圖避免必須以超級使用者權限執行整個測試套件。假設出於本範例的目的,它是
top
. 我的命令啟動了它自己的一些子程序,並且可能會陷入死鎖。超時後,我想殺死它(和它的孩子)。顯而易見的解決方案似乎是讓我的命令負責一個新的會話/程序組,允許我一次完全殺死它及其子程序。我不知道如何使它與sudo
. 在我的情況下,sudo
總是無一例外地受到密碼保護,我想保持這種方式……如果可能的話。
- 作品:
setsid top
- 有效,但不會產生新的程序組:
sudo setsid top
- 有問題 - 很難以安全可靠的方式獲取 root 密碼:
setsid sudo top
我沒有設法使(3)以乾淨的方式工作。我搞砸了
SUDO_ASKPASS
。令我驚訝的是 (2) 實際執行但沒有給我所需的新程序組。
systemd─┬─ ... ├─kdeinit5─┬─ ... │ └─yakuake─┬─2*[bash] │ ├─bash───sudo───top │ ├─bash───pstree ...
場景 2 可以這樣修復,無需使用
setsid
:
sudo -b command
sudo
這將在系統的 init 程序(包括命令)的正下方創建一個新程序組。不過,有一點建議:如果使用 Python 啟動這樣的程序組,則生成
subprocess.Popen
的對象PID
(團體)。我的解決方法(需要):subprocess.Popen(...).pid``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)))