如果执行时间过长,我想杀死一个子进程。
我知道我必须使用os.kill
或os.killpg.
然而,如果我不是root用户,问题就会出现。例如,在我设计的GUI中,我想调用subprocess,os.kill
或os.killpg
来杀死子进程。但我的GUI由apache拥有。因此,当涉及命令os.kill时,我会收到错误:
[type:
exceptions.OSError value: [Errno 1] Operation not permitted
此外,我的python版本是2.4.3。所以不能使用terminate()...
有人能给我一些想法吗?
非常感谢!
P.S。 我的代码的相关部分:
timeout=4
subp = subprocess.Popen('sudo %s'%commandtosend, shell=True,preexec_fn=os.setsid, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while subp.poll() is None:
time.sleep(0.1)
now = datetime.datetime.now()
if (now - start).seconds > timeout:
os.kill(subp.pid, signal.SIGKILL)
#os.killpg(subp.pid, signal.SIGKILL)
break
答案 0 :(得分:3)
您的子进程正在以超级用户权限运行(因为您使用sudo启动它)。 要杀死它,你需要成为超级用户。
一种选择是不使用os.kill但运行'sudo kill 5858',其中5858将是subprocess.Popen生成的进程的PID。
值得注意的是,如果您的程序允许用户控制 commandtosend ,您将为用户授予整个计算机的超级用户权限。
答案 1 :(得分:2)
从子进程命令中删除sudo
,如果你应该这样做,因为你不应该在你的GUI中运行sudo用户的子进程,这绝对是一个安全漏洞:
subprocess.Popen(commandtosend, shell=True,preexec_fn=os
^^
Here don't put sudo
像这样,您的子流程将使用www-data用户(Apache用户)启动,您可以使用os.kill(subp.pid, signal.SIGKILL)
将其终止。
如果无法从子进程中删除sudo
(这是坏的),则必须像这样执行kill:
os.system("sudo kill %s" % (subp.pid, ))
希望这有助于:)