subprocces.Popen,终止进程以 sudo 启动

subprocces.Popen, kill process started with sudo

我正在尝试通过 python 脚本启动并稍后终止需要 sudo 的进程。即使 python 脚本本身是 运行 和 sudo 并且 kill() 没有给出任何权限错误,进程也不会被终止(并且永远不会收到 SIGKILL)。

对此进行调查,我发现 Popen() returns 至少我假设是 sudo 进程的进程 ID,而不是我想要控制的进程。所以当我稍后正确地杀死它时,底层进程保持 运行ning。 (虽然如果我在 python 代码中杀死 sudo 进程之前杀死 python 程序,底层进程也会被杀死,所以我想也必须有一种方法可以手动执行此操作)。

我知道使用 pgreppidof 搜索正确的进程可能是一个选项,但由于进程名称可能不是唯一的,它似乎不必要地容易出错(它也可能可能会在大约同一时间启动同名进程,因此采用最新的进程可能无济于事。

是否有任何解决方案可以可靠地获得 python 中使用 sudo 启动的基础进程的 pid

使用 Python3.

我进行测试的代码,从 :

稍作修改
import subprocess, time

cmd = ["sudo", "testscript.sh"]
def myfunction(action, process=None):
    if action === "start":
        process = subprocess.Popen(cmd)
        return process
    if action === "stop"
        # kill() and send_signal(signal.SIGTERM) do not work either
        process.terminate()
        
process = myfunction("start")
time.sleep(5)
myfunction("stop", process);

好的,我可以在这里回答我自己的问题(我在 https://izziswift.com/how-to-terminate-a-python-subprocess-launched-with-shelltrue/ 上找到的)。诀窍是用以下方式打开流程:

subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)

然后杀死它:

os.killpg(os.getpgid(process.pid), signal.SIGTERM)

这次我用shell打开,用os杀掉进程组里的所有进程