Joh*_*ard 10 python linux sudo subprocess kill
我正在与一个可以进行根级调用而无需提供密码的用户一起运行。我的用户目前做这样的事情
pr = subprocess.Popen("sudo sleep 100".split())
sleep(5)
pr.kill()
Run Code Online (Sandbox Code Playgroud)
但这会导致此错误,因为用户不是 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
Run Code Online (Sandbox Code Playgroud)
所以我尝试做这样的事情
pr = subprocess.Popen("sudo sleep 100".split())
sleep(5)
kill_pr = subprocess.Popen("sudo kill {}".format(pr.pid))
Run Code Online (Sandbox Code Playgroud)
但这并没有杀死有问题的进程。例如,如果
>> subprocess.Popen("sudo sleep 100".split()).pid
5000
Run Code Online (Sandbox Code Playgroud)
但
$ pgrep sleep
5001
Run Code Online (Sandbox Code Playgroud)
所以似乎pid返回的subprocess.Popen("..").pid值比运行我想杀死的命令的进程的实际 pid 高一个
我假设pid从Popen调用返回的是父进程,所以我尝试做类似的事情
sudo kill -- -$PID,那个$PID从哪里回来的Popen,但这只是给了我
kill: sending signal to -2100 failed: No such process
Run Code Online (Sandbox Code Playgroud)
为什么进程不存在?
本质上,我只需要一种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))
Run Code Online (Sandbox Code Playgroud)
它会杀死启动python解释器的进程
>>> Terminated
Run Code Online (Sandbox Code Playgroud)
所以相反,我设置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))
Run Code Online (Sandbox Code Playgroud)
在另一个外壳中,如果我检查
pgrep sleep
Run Code Online (Sandbox Code Playgroud)
什么都没有出现,所以它实际上被杀死了。
| 归档时间: |
|
| 查看次数: |
4377 次 |
| 最近记录: |