sudo setsid命令不会产生新的进程组吗?

sme

我正在考虑一种情况,在这种情况下,我希望将程序/命令sudo作为软件测试的一部分来运行这些命令是从基于该subprocess模块的Python脚本启动的我试图避免必须以超级用户权限运行整个测试套件。

假设出于本示例的目的,它是top我的命令启动了自己的几个子进程,并且可能会陷入死锁。超时后,我想杀死它(及其子进程)。显而易见的解决方案似乎是让我的命令成为新的会话/过程组的负责人,让我立即杀死它及其子级。我不知道该如何使用sudo就我而言,sudo始终是无例外地受密码保护的,如果可能的话,我想保持这种方式。

  1. 作品: setsid top
  2. 可以,但是不会产生新的进程组: sudo setsid top
  3. 有问题-难以以安全可靠的方式获取root密码: setsid sudo top

我没有以干净的方式使(3)工作。我搞砸了SUDO_ASKPASS

令我感到惊讶的是,事实(2)实际运行,但没有给我所需的新过程组。

systemd─┬─ ...
        ├─kdeinit5─┬─ ...
        │          └─yakuake─┬─2*[bash]
        │                    ├─bash───sudo───top
        │                    ├─bash───pstree
        ...
sme

可以这样解决方案2,而无需使用setsid

sudo -b command

这将在系统的初始化进程(包括sudo命令)的正下方创建一个新的进程组


建议:尽管如此,如果用Python的进程组启动了这样的进程组subprocess.Popen,则结果对象的PIDsubprocess.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章