2012-05-11 117 views
0

我有一個作爲守護程序運行的Jython腳本。它啓動後,登錄到服務器,然後進入一個循環,檢查要處理的事件,處理它們,然後休眠5秒鐘。停止守護進程的正確方法

我有一個cron作業,每5分鐘檢查一次以確保該進程正在運行,如果沒有,則再次啓動它。

我有另一個cron工作,每天一次重新啓動過程,無論如何。我們這樣做是因爲有時候守護進程與服務器的連接有時會被搞砸,而且無法分辨這種情況何時發生。

我在這個「解決方案」中遇到的問題是第二個cron作業,它會殺死進程並啓動另一個作業。它可以,如果它在睡覺時被殺死,但是如果守護進程正在處理被殺的東西時,可能會發生不好的事情。

什麼是停止守護進程的正確方法...而不是僅僅殺死它?

這是一般的標準做法,在Python還是Java?在未來,我可能會轉而使用純Python而不是Jython。

感謝

+0

你的意思是「守護進程與服務器的連接有時會搞砸」? – Jordan

回答

1

你可以先終止該進程,並通過Jython腳本接收信號時,發送SIGKILL之前發送SIGTERM

例如,發送一個SIGTERM,可以通過您的腳本接收和處理,如果在指定的時間段內沒有任何事情發生,您可以發送SIGKILL並強制終止進程。

有關處理事件的更多信息,請參閱signal模塊文檔。

此外,例如,可能是方便的(使用atexit鉤):

#!/usr/bin/env python 

from signal import signal, SIGTERM 
from sys import exit 
import atexit 

def cleanup(): 
    print "Cleanup" 

if __name__ == "__main__": 
    from time import sleep 
    atexit.register(cleanup) 

    # Normal exit when killed 
    signal(SIGTERM, lambda signum, stack_frame: exit(1)) 

    sleep(10) 

here兩者。

+0

謝謝......這也適用於Jython。 –

0

正常的Linux類型的方法是將信號發送到掛起的長時間運行的進程。你可以用Python內置的信號庫來處理這個問題。

http://docs.python.org/library/signal.html

所以,你可以從你的第二個應用程序發送SIGHUP到您的第一個應用程序,並在基礎上,無論你在它的確定重新啓動的狀態下,第一處理。

+0

謝謝! petr的例子「正常工作」,但如果遇到問題或者我感到無聊,我會參考該文檔;-) –