我正在考虑一种情况,在这种情况下,我希望将程序/命令sudo
作为软件测试的一部分来运行。这些命令是从基于该subprocess
模块的Python脚本启动的。我试图避免必须以超级用户权限运行整个测试套件。
假设出于本示例的目的,它是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
...
可以这样解决方案2,而无需使用setsid
:
sudo -b command
这将在系统的初始化进程(包括sudo
命令)的正下方创建一个新的进程组。
建议:尽管如此,如果用Python的进程组启动了这样的进程组subprocess.Popen
,则结果对象的PID
(subprocess.Popen(...).pid
)不能用于确定PGID
最终的使用方式,如模式kill -9 -- -{PGID}
(它将杀死Python解释器,而不是新生成的进程)团体)。我的解决方法(需要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)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句