【问题标题】:subprocces.Popen, kill process started with sudosubprocess.Popen,杀死进程以 sudo 开始
【发布时间】:2021-10-19 11:35:03
【问题描述】:

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

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

我知道使用pgreppidof 搜索正确的进程可能是一种选择,但由于进程名称可能不是唯一的,因此似乎容易出错(也可能出现带有相同的名称大约在同一时间开始,因此使用最新的可能无济于事。

是否有任何解决方案可以可靠地获取在 python 中以 sudo 启动的底层进程的pid

使用 Python3。

我进行测试的代码,取自 https://stackoverflow.com/a/43417395/1171541 稍作修改:

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);

【问题讨论】:

  • 一个shell脚本会自己执行一些东西。你得到的 pid 是 shell 脚本执行的,而不是你在 shell 脚本中执行的 pid。很高兴知道你在 shell 脚本中做了什么!
  • 嗨,Kris,谢谢,但只有在设置了 shell=True 时才会这样,对吧?现在 shell 脚本只输出数字,但它应该是动态的。但我找到了一种方法,将发布解决方案。

标签: python python-3.x subprocess


【解决方案1】:

好的,我可以在这里回答我自己的问题(我在 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杀死进程组中的所有进程。

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 2017-07-27
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多