【发布时间】:2021-10-19 11:35:03
【问题描述】:
我正在尝试通过 python 脚本启动并稍后终止需要 sudo 的进程。即使 python 脚本本身使用sudo 运行,kill() 没有给出任何权限错误,进程也不会被杀死(并且永远不会收到SIGKILL)。
对此进行调查,我发现Popen() 返回 sudo 进程的进程 id,我假设至少,而不是我想要控制的进程。因此,当我稍后正确杀死它时,底层进程会继续运行。 (虽然如果我在杀死python代码中的sudo进程之前杀死python程序,那么底层进程也会被杀死,所以我想也必须有一种手动执行此操作的方法。
我知道使用pgrep 或pidof 搜索正确的进程可能是一种选择,但由于进程名称可能不是唯一的,因此似乎容易出错(也可能出现带有相同的名称大约在同一时间开始,因此使用最新的可能无济于事。
是否有任何解决方案可以可靠地获取在 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