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

zha*_*ing 2 python apache user-interface subprocess

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

但是,如果我不是 root 用户,问题就会出现。例如,在我设计的GUI中,我想调用子进程,或者os.kill杀死os.killpg子进程。但我的 GUI 属于 apache。所以当涉及到命令 os.kill 时,我会得到错误:

[type: 
exceptions.OSError value: [Errno 1] Operation not permitted 
Run Code Online (Sandbox Code Playgroud)

另外,我的python版本是2.4.3。所以终止()...不能使用。

有人能给我一些想法吗?

多谢!

PS 我的代码的相关部分:

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
Run Code Online (Sandbox Code Playgroud)

mou*_*uad 5

sudo如果可能的话,请从 subprocess 命令中删除,因为您不应该从 GUI 的 sudo 用户中运行子进程,这绝对是一个安全漏洞:

subprocess.Popen(commandtosend, shell=True,preexec_fn=os
                 ^^
                 Here don't put sudo
Run Code Online (Sandbox Code Playgroud)

像这样,您的子进程将使用 www-data 用户(Apache 用户)启动,您可以使用os.kill(subp.pid, signal.SIGKILL).

如果无法sudo从子进程中删除(这很糟糕),您将不得不像这样执行终止:

os.system("sudo kill %s" % (subp.pid, ))
Run Code Online (Sandbox Code Playgroud)

希望这能有所帮助:)