如何在Python中杀死sudo-started子进程?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (399)

我正在运行一个可以进行根级调用而无需提供密码的用户。我的用户目前正在做这样的事情:

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

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

sudo kill -- -$PID,从哪里$PID回来Popen,但那只是给了我

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

从本质上讲,我只需要一种方法来sudo使用python的子进程运行一个命令,然后当我需要的时候能够杀死它。

提问于
用户回答回答于

在执行时pgrep sleep,会显示sleep命令的PID ,作为sudo创建的进程的子进程运行。

作为一个快速演示,我将以下内容保存为subproc.py

import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)

运行这个脚本时,我们可以看到两个进程:

~/$ python subproc.py
Process spawned with PID: 5296

~/$ ps all | grep sleep
    0  5296     1     sudo sleep 100
    0  5297  5296     sleep 100

你会注意到你在代码中知道的PID是'父'sudo进程。这是你应该杀死的过程,但你需要使用sudo来做到这一点:

subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)

扫码关注云+社区

领取腾讯云代金券