2010-07-19 55 views
3

在Linux机器上,我有一个始终从预定义用户启动的python脚本。它可能需要一段时间才能完成,因此我希望允许其他用户在网络上停止它。终止另一个用户的脚本

使用kill失败,操作不允许。

我可以以某种方式修改我的长时间运行的Python脚本,以便它从另一个用户收回信号吗?显然,另一个用户是启动Web服务器的用户。

可能有完全不同的方式来解决这个问题,我现在无法想到。

+0

您是否正在运行kill作为启动该进程的用户? – nmichaels 2010-07-19 12:48:34

+0

不。它是从php脚本作为Web服务器用户启动的。 – clorz 2010-07-19 12:55:26

回答

1

如果您将您的python脚本设置为在服务器上运行为deamon(页面底部的Unix Daemon)(这听起来很合适),并且您为apache用户授予执行服务的init.d脚本的权限,那么你就可以控制与PHP代码类似于此服务(从here - 在这种情况下,服务脚本的名称是“otto2”):

<? 
$otto = "/usr/etc/init.d/otto2 "; 

if($_GET["action"]) { 
    $ret = shell_exec($otto.$_GET["action"]); 
    //Check your ret value 
} 
else { 
    ?> 
    <a href="<?=$PHP_SELF?>?action=start">Start </a> 
    <a href="<?=$PHP_SELF?>?action=stop">Stop </a> 
    <? 
} 

?> 

上的说明是“真正的基本未经测试的代码” :)

0

您可以使用sudo以root用户的身份执行kill命令,但这是非常糟糕的做法。

如何让长时间运行的脚本每x秒检查一些情况,例如存在像/tmp/stop-xyz.txt这样的文件?如果找到该文件,脚本立即终止。

(或进程间通信的任何其他手段 - 它并不重要。)

1

如果你不想使用正确的权限来执行kill命令,你可以发送任何其他信号,其他脚本。这是其他脚本的责任终止。除非您有权这样做,否则您无法强制执行此操作。

这可能发生在网络连接或'kill'文件存在被另一个脚本检查的情况下,或脚本能够听到的任何其他文件。

1

关于我的头顶,一种解决方案是穿线脚本并通过某种形式等待杀手信号。或者,而不是线程化,您可以创建一个脚本每隔一个循环检查N次的文件 - 然后您只需向该文件写入终止信号(当然这具有Web用户的写入权限)。

我不是非常熟悉杀死,除了杀死我自己的脚本,所以可能有更好的解决方案。