在python中杀死sudo启动的子进程

约翰·阿拉德(​​John Allard):

我与一个可以进行根级调用而无需提供密码的用户一起运行。我的用户当前正在执行类似操作

pr = subprocess.Popen("sudo sleep 100".split())
sleep(5)
pr.kill()

但这导致此错误,因为用户不是root用户,所以它无法杀死root用户进程

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 1572, in kill
    self.send_signal(signal.SIGKILL)
  File "/usr/lib/python2.7/subprocess.py", line 1562, in send_signal
    os.kill(self.pid, sig)
OSError: [Errno 1] Operation not permitted

所以我尝试做这样的事情

pr = subprocess.Popen("sudo sleep 100".split())
sleep(5)
kill_pr = subprocess.Popen("sudo kill {}".format(pr.pid))

但这并不能终止所讨论的过程。例如,如果

>> subprocess.Popen("sudo sleep 100".split()).pid
5000

$ pgrep sleep
5001

因此看来,pid从那里返回的subprocess.Popen("..").pid值比运行我要杀死的命令的进程的实际pid高

我假设pidPopen调用返回的是父进程,所以我尝试做类似的事情

sudo kill -- -$PID,那$PID是从哪儿回来的Popen,但这给了我

kill: sending signal to -2100 failed: No such process

为什么不存在该过程?

本质上,我只需要一种sudo使用python的子进程来运行命令的方法,然后能够在需要时将其杀死。我假设我需要sudo kill使用pid要杀死的进程或类似命令运行某种类型的命令,但是我无法确定确切的执行方法。

约翰·阿拉德(​​John Allard):

我想我知道了,问题是,如果我这样做了

import subprocess, os
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
pgid = os.getpgid(pr.pid)
subprocess.check_output("sudo kill {}".format(pgid))

它会杀死启动python解释器的进程

>>> Terminated

因此,我将设置preexec_fnos.setpgrp

import subprocess, os
pr = subprocess.Popen(["sudo", "sleep", "100"], preexec_fn=os.setpgrp)
print("Process spawned with PID: %s" % pr.pid)
pgid = os.getpgid(pr.pid)
subprocess.check_output("sudo kill {}".format(pgid))

在另一个外壳中,如果我检查

pgrep sleep

没有任何显示,因此实际上已被杀死。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章