在我正在开发的项目中,有一些代码使用sudo
启动了一个长时间运行的进程:
subprocess.Popen(['sudo', '/usr/bin/somecommand', ...])
我想在父母退出时清理这个过程。目前,子进程在父进程退出时保持运行(当然,重新附加到init
)。
我不确定这个问题的最佳解决方案。代码仅限于通过sudo运行某些命令,并且授予运行sudo kill
的一揽子权限最多也是粗略的。
我没有可以关闭子进程的开放管道(子进程没有从stdin读取),我无法修改子进程的代码。
在这种情况下是否还有其他可能有效的机制?
答案 0 :(得分:5)
首先,我回答这个问题。虽然我认为这不是一件好事,但这正是你所要求的。我会将该子进程包装成一个可以监听stdin
的小程序。然后你可以sudo
该程序,它将能够在没有sudo
的情况下运行该进程,并且知道它的pid
并拥有在你通过它时要求它终止进程的权限stdin
这样做。
但是,通常这种情况意味着sudo
没有密码和安全性差。最常见的技术是使用降低程序的权限,而不是提升它们。在这种情况下,您应该创建一个由超级用户启动的运行程序,而不是通过降低权限启动主程序并侦听管道进行通信。当需要运行一个命令时,你的主程序告诉跑步者程序,跑步者程序完成这项工作。当需要终止命令时,再次通过管道将其告知转轮程序。
通用规则是:
这就是许多应用程序所做的事情。我想到的第一个例子是Apache Web服务器(至少在* nix上),它有一个小的顶级程序和preforked工作程序,它们不是以root / wheel / what-else-is-the-superuser-运行的 - 用户名。
答案 1 :(得分:0)
这将在最后一行引发OSError: [Errno 1] Operation not permitted
:
p = subprocess.Popen(['sudo', '/usr/bin/somecommand', ...])
print p.stdout.read()
p.terminate()
假设sudo不会要求输入密码,一个解决方法是创建一个调用sudo的shell脚本...
#!/bin/sh
sudo /usr/bin/somecommand
...然后在Python中执行此操作:
p = subprocess.Popen("/path/to/script.sh", cwd="/path/to")
print p.stdout.read()
p.terminate()