python
  • daemon
  • python-daemon
  • 2014-09-30 106 views 2 likes 
    2

    myalert.pyPython的守護程序:檢查有一個守護進程運行在任何時候都

    from daemon import Daemon 
    import os, time, sys 
    
    class alertDaemon(Daemon): 
        def run(self): 
         while True: 
          time.sleep(1) 
    
    if __name__ == "__main__": 
        alert_pid = '/tmp/ex.pid' 
    
        # if pid doesnt exists run 
        if os.path.isfile(alert_pid):   # is this check enough? 
         sys.exit(0) 
    
        daemon = alertDaemon(alert_pid) 
        daemon.start() 
    

    鑑於沒有其他程序或用戶將創建pid文件:

    1)是否有其中pid的情況下,還沒有存在的守護進程仍在運行?
    2)有沒有pid確實存在但守護進程沒有運行的情況?

    因爲如果對上述至少一個問題的答案是肯定的,那麼只要檢查pid文件的存在是不夠的,如果我的目標有一個守護進程始終運行。問:如果我必須檢查過程,那麼我希望避免像系統調用ps -ef和grep這樣的腳本名稱。有沒有這樣做的標準方式?

    注:腳本,myalert.py,將是一個cronjob

    +0

    可能試圖偵聽某個端口,然後如果第二個守護進程啓動,該端口將不可用。 – Hacketo 2014-09-30 14:25:16

    +0

    你正在使用哪個'daemon'庫? – dano 2014-09-30 14:54:15

    +0

    @ dano4來自http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ – ealeon 2014-09-30 14:59:36

    回答

    2

    python-daemon庫,它是爲PEP 3143的參考實現:「標準守護進程庫」,通過你傳遞給DaemonContext對象pid文件使用一個文件鎖(通過lockfile庫)處理此。底層操作系統保證當守護程序進程退出時釋放文件鎖定,即使其不完全退出。這裏有一個簡單的使用例子:

    import daemon 
    from daemon.pidfile import PIDLockFile 
    
    context = daemon.DaemonContext(
        pidfile= PIDLockFile('/var/run/spam.pid'), 
        ) 
    
    with context: 
        main() 
    

    所以,如果一個新的實例啓動時,它並沒有以確定是否創建了現有的pid文件的過程中依然通過PID本身運行;如果它可以獲取文件鎖定,則不會有其他實例正在運行(因爲它們已經獲得鎖定)。如果它不能獲取鎖,則另一個守護進程實例必須正在運行。

    您遇到麻煩的唯一方法是,如果有人出現並在守護程序運行時手動刪除了pid文件。但我認爲你不需要擔心有人故意以這種方式破壞事情。

    理想情況下,python-daemon將成爲標準庫的一部分,PEP 3143的最初目標也是如此。不幸的是,PEP得到延期,主要是因爲沒有人願意真正完成剩餘的工作,標準庫:

    覆蓋在這個PEP的概念進一步探索一直 推遲缺乏有志於促進PEP的 目標和收集,並納入反饋電流的冠軍,並與 足夠的可用時間有效地做到這一點。

    +0

    謝謝!正是我所需要的 – ealeon 2014-09-30 15:20:38

    +0

    儘管pypi頁面已經有幾年沒有更新,但它看起來像庫[這裏](https://alioth.debian.org/projects/python-daemon/)上仍然有活躍的開發,由原作者提供。特別是,看起來Python 3的兼容性正在開發中(儘管它看起來仍然與Python 3.x實際上不兼容)。 – dano 2014-09-30 15:27:52

    0

    有一些的你帶來了這裏的問題商量好了:我在其中看到這個https://serverfault.com/questions/115838/are-pid-files-reliable-for-determining-whether-a-process-is-running

    0

    幾種方法執行:

    1. 檢查wheter存在了pidfile - >如果是這樣,出口與這樣的錯誤消息「pid文件存在 - RM,如果你確定沒有進程正在運行」

    2. 檢查pidfile是否存在 - >如果是,檢查是否存在該pid的進程 - >如果是這種情況,告訴用戶「進程正在運行..」。衝突(重新用於另一個進程)PID號的風險太小,以至於被忽略;告訴用戶如何使程序的情況下,再次啓動時發生錯誤

    提示:檢查過程的存在,你可以檢查/proc/<pid>目錄

    還要確保你做的一切可能當你的腳本退出刪除pidfile進程文件,如:

    1. 裹代碼在try .. finally

      # Check & create pidfile 
      try: 
          # your application logic 
      
      finally: 
          # remove pidfile 
      
    2. 您甚至可以安裝信號處理程序(通過signal模塊)在接收到通常不會引發異常但直接退出的信號時刪除pidfile。

    相關問題