不是根用户,如何在python 2.4中终止子进程
如果执行时间太长,我想终止一个子进程。 我知道我必须使用不是根用户,如何在python 2.4中终止子进程,python,apache,user-interface,subprocess,Python,Apache,User Interface,Subprocess,如果执行时间太长,我想终止一个子进程。 我知道我必须使用os.kill或os.killpg. 但是,如果我不是root用户,问题就会出现。例如,在我设计的GUI中,我想调用子进程,并os.kill或os.killpg终止子进程。但是我的GUI是apache所有的。因此,当涉及到os.kill命令时,我将得到错误: [type: exceptions.OSError value: [Errno 1] Operation not permitted 此外,我的python版本是2.4.3。因此
os.kill
或os.killpg.
但是,如果我不是root用户,问题就会出现。例如,在我设计的GUI中,我想调用子进程,并os.kill
或os.killpg
终止子进程。但是我的GUI是apache所有的。因此,当涉及到os.kill命令时,我将得到错误:
[type:
exceptions.OSError value: [Errno 1] Operation not permitted
此外,我的python版本是2.4.3。因此不能使用terminate()
谁能给我一些建议吗
非常感谢
附言。
我的代码的相关部分:
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
您的子进程正在以超级用户权限运行(因为您使用sudo启动它)。 要杀死它,你需要成为超级用户 一个选项是不使用os.kill,而是运行“sudo kill 5858”,其中5858是subprocess.Popen生成的进程的PID
还值得注意的是,如果您的程序允许用户控制命令发送,您将授予用户对整个机器的超级用户权限。从subprocess命令中删除
sudo
,如果可能,您应该这样做,因为您不应该从GUI在sudo用户中运行子进程,这绝对是安全漏洞:
subprocess.Popen(commandtosend, shell=True,preexec_fn=os
^^
Here don't put sudo
像这样,您的子进程将使用www数据用户(Apache用户)启动,您可以使用os.kill(subp.pid,signal.SIGKILL)
杀死它
如果无法从子流程中删除sudo
(这是不好的),则必须按如下方式执行kill:
os.system("sudo kill %s" % (subp.pid, ))
希望这能有所帮助:)奇点,非常感谢您的建议。我明白你的意思,我会试试:-)我的子进程是由apache用户启动的,但它无权启动我的commandtosend,所以我必须使用sudo。所以也许我必须使用操作系统。system@zhaojing:如果您无法更改commandtosend的权限以apache用户身份运行它,我认为唯一的解决方案是使用os.execute yes;希望这能有所帮助:)