我与一个可以进行根级调用而无需提供密码的用户一起运行。我的用户当前正在执行类似操作
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高
我假设pid
从Popen
调用返回的是父进程,所以我尝试做类似的事情
sudo kill -- -$PID
,那$PID
是从哪儿回来的Popen
,但这给了我
kill: sending signal to -2100 failed: No such process
为什么不存在该过程?
本质上,我只需要一种sudo
使用python的子进程来运行命令的方法,然后能够在需要时将其杀死。我假设我需要sudo kill
使用pid
要杀死的进程或类似的命令运行某种类型的命令,但是我无法确定确切的执行方法。
我想我知道了,问题是,如果我这样做了
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_fn
为os.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] 删除。
我来说两句