在Linux機器上,我有一個始終從預定義用戶啓動的python腳本。它可能需要一段時間才能完成,因此我希望允許其他用戶在網絡上停止它。終止另一個用戶的腳本
使用kill失敗,操作不允許。
我可以以某種方式修改我的長時間運行的Python腳本,以便它從另一個用戶收回信號嗎?顯然,另一個用戶是啓動Web服務器的用戶。
可能有完全不同的方式來解決這個問題,我現在無法想到。
在Linux機器上,我有一個始終從預定義用戶啓動的python腳本。它可能需要一段時間才能完成,因此我希望允許其他用戶在網絡上停止它。終止另一個用戶的腳本
使用kill失敗,操作不允許。
我可以以某種方式修改我的長時間運行的Python腳本,以便它從另一個用戶收回信號嗎?顯然,另一個用戶是啓動Web服務器的用戶。
可能有完全不同的方式來解決這個問題,我現在無法想到。
如果您將您的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>
<?
}
?>
上的說明是「真正的基本未經測試的代碼」 :)
您可以使用sudo
以root用戶的身份執行kill命令,但這是非常糟糕的做法。
如何讓長時間運行的腳本每x秒檢查一些情況,例如存在像/tmp/stop-xyz.txt
這樣的文件?如果找到該文件,腳本立即終止。
(或進程間通信的任何其他手段 - 它並不重要。)
如果你不想使用正確的權限來執行kill命令,你可以發送任何其他信號,其他腳本。這是其他腳本的責任終止。除非您有權這樣做,否則您無法強制執行此操作。
這可能發生在網絡連接或'kill'文件存在被另一個腳本檢查的情況下,或腳本能夠聽到的任何其他文件。
關於我的頭頂,一種解決方案是穿線腳本並通過某種形式等待殺手信號。或者,而不是線程化,您可以創建一個腳本每隔一個循環檢查N次的文件 - 然後您只需向該文件寫入終止信號(當然這具有Web用戶的寫入權限)。
我不是非常熟悉殺死,除了殺死我自己的腳本,所以可能有更好的解決方案。
您是否正在運行kill作爲啓動該進程的用戶? – nmichaels 2010-07-19 12:48:34
不。它是從php腳本作爲Web服務器用戶啓動的。 – clorz 2010-07-19 12:55:26