2010-07-19 59 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用戶的寫入權限)。

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