首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中终止sudo启动的子进程

在python中终止sudo启动的子进程
EN

Stack Overflow用户
提问于 2018-05-31 14:56:49
回答 3查看 4.8K关注 0票数 10

我使用的用户可以进行root级别的调用,而无需提供密码。我的用户当前执行的操作如下所示

代码语言:javascript
复制
pr = subprocess.Popen("sudo sleep 100".split())
sleep(5)
pr.kill()

但是这会导致这个错误,因为用户不是root用户,所以它不能杀死根进程

代码语言:javascript
复制
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

所以我试着这样做

代码语言:javascript
复制
pr = subprocess.Popen("sudo sleep 100".split())
sleep(5)
kill_pr = subprocess.Popen("sudo kill {}".format(pr.pid))

但这并不会扼杀有问题的进程。例如,如果

代码语言:javascript
复制
>> subprocess.Popen("sudo sleep 100".split()).pid
5000

代码语言:javascript
复制
$ pgrep sleep
5001

因此,从subprocess.Popen("..").pid返回的pid似乎比运行我要杀死的命令的进程的实际pid高1

我假设从Popen调用返回的pid是父进程,所以我尝试这样做

sudo kill -- -$PID,其中$PID是从Popen返回的那个,但这给了我

代码语言:javascript
复制
kill: sending signal to -2100 failed: No such process

为什么进程不存在?

从本质上讲,我只需要一种方法来使用Python子进程在sudo中运行命令,然后在需要的时候终止它。我假设我需要用我想要杀死的进程的pid运行某种类型的sudo kill命令,或者类似的东西,但是我不能确切地确定如何做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-01 01:39:44

我想我想通了,问题是如果我这么做了

代码语言:javascript
复制
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解释器的进程。

代码语言:javascript
复制
>>> Terminated

因此,我将preexec_fn设置为os.setpgrp

代码语言:javascript
复制
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))

在另一个shell中,如果我检查

代码语言:javascript
复制
pgrep sleep

什么都没有显示,所以它实际上被杀死了。

票数 5
EN

Stack Overflow用户

发布于 2018-05-31 15:12:23

当您执行pgrep sleep时,您将看到sleep命令的PID,该命令作为您创建的sudo进程的子进程运行。

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

代码语言:javascript
复制
import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)

运行此脚本时,我们可以看到产生了两个进程:

代码语言:javascript
复制
~/$ python subproc.py
Process spawned with PID: 5296

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

您会注意到,您在代码中知道的PID是'parent‘sudo进程。这是您应该终止的进程,但您需要使用sudo来完成此操作:

代码语言:javascript
复制
subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)
票数 3
EN

Stack Overflow用户

发布于 2020-05-03 13:50:47

我在根子过程中也遇到了同样的问题,但是这里和这里的答案-- Python how to kill root subprocess对我不起作用。

最后,唯一有效的方法是:

代码语言:javascript
复制
proc = subprocess.Popen(["sudo", exe_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
.
.
.
os.system("sudo pkill -9 -P " + str(proc.pid))

不需要- preexec_fn=os.setpgrp

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50618411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档