我正在研究一个我想在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