不是root用户,如何在python 2.4中杀死子进程

时间:2010-11-12 09:30:52

标签: python apache user-interface subprocess

如果执行时间过长,我想杀死一个子进程。 我知道我必须使用os.killos.killpg.

然而,如果我不是root用户,问题就会出现。例如,在我设计的GUI中,我想调用subprocess,os.killos.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

2 个答案:

答案 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, ))

希望这有助于:)