Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不是根用户,如何在python 2.4中终止子进程_Python_Apache_User Interface_Subprocess - Fatal编程技术网

不是根用户,如何在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;希望这能有所帮助:)