subprocces.Popen,终止进程以 sudo 启动
subprocces.Popen, kill process started with sudo
我正在尝试通过 python 脚本启动并稍后终止需要 sudo
的进程。即使 python 脚本本身是 运行 和 sudo
并且 kill()
没有给出任何权限错误,进程也不会被终止(并且永远不会收到 SIGKILL
)。
对此进行调查,我发现 Popen()
returns 至少我假设是 sudo 进程的进程 ID,而不是我想要控制的进程。所以当我稍后正确地杀死它时,底层进程保持 运行ning。 (虽然如果我在 python 代码中杀死 sudo 进程之前杀死 python 程序,底层进程也会被杀死,所以我想也必须有一种方法可以手动执行此操作)。
我知道使用 pgrep
或 pidof
搜索正确的进程可能是一个选项,但由于进程名称可能不是唯一的,它似乎不必要地容易出错(它也可能可能会在大约同一时间启动同名进程,因此采用最新的进程可能无济于事。
是否有任何解决方案可以可靠地获得 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杀掉进程组里的所有进程
我正在尝试通过 python 脚本启动并稍后终止需要 sudo
的进程。即使 python 脚本本身是 运行 和 sudo
并且 kill()
没有给出任何权限错误,进程也不会被终止(并且永远不会收到 SIGKILL
)。
对此进行调查,我发现 Popen()
returns 至少我假设是 sudo 进程的进程 ID,而不是我想要控制的进程。所以当我稍后正确地杀死它时,底层进程保持 运行ning。 (虽然如果我在 python 代码中杀死 sudo 进程之前杀死 python 程序,底层进程也会被杀死,所以我想也必须有一种方法可以手动执行此操作)。
我知道使用 pgrep
或 pidof
搜索正确的进程可能是一个选项,但由于进程名称可能不是唯一的,它似乎不必要地容易出错(它也可能可能会在大约同一时间启动同名进程,因此采用最新的进程可能无济于事。
是否有任何解决方案可以可靠地获得 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杀掉进程组里的所有进程