2014-02-24 171 views
2

我想創建一個永久運行的程序,該程序一次只能運行一個實例,並且可以使用init.d腳本啓動。 python-daemon似乎是一個很好的選擇,因爲它是PEP 3143的參考實現。python守護進程的單個實例(使用python守護進程)

無論如何,我不明白什麼是PID鎖定文件,因爲它不會阻止程序運行兩次。

我應該手動檢查我的init.d腳本中是否存在鎖定文件(基於'/etc/init.d/skeleton')?另外我該如何殺死它?獲取PID文件中的PID號併發送一個SIGTERM?

非常感謝。

+0

是什麼讓你這樣說:「什麼PID鎖定文件的,因爲它沒有阻止被運行兩次程序」。如果PID文件被鎖定,取決於鎖定實現,它可以防止程序運行兩次(第二個實例不會獲得鎖定)。 – isedev

+0

而且,是的,使用PID文件中的PID來殺死守護進程。 – isedev

+0

我在看htop中的進程,並在兩次啓動後看到兩個進程。其中一人正在睡覺,這不是我預期的行爲。 – Charly

回答

0

我結束了使用其網站目前下來,這裏的鏈接到一個引擎收錄桑德馬雷夏爾代碼:http://pastebin.com/FWBUfry5

下面你可以找到你如何使用它,它產生我所期望的行爲的例子:它不允許你啓動兩個實例。

import sys, time 
    from daemon import Daemon 


    class MyDaemon(Daemon): 
      def run(self): 
        while True: 
          time.sleep(1) 

    if __name__ == "__main__": 
      daemon = MyDaemon('/tmp/daemon-example.pid') 
      if len(sys.argv) == 2: 
        if 'start' == sys.argv[1]: 
          daemon.start() 
        elif 'stop' == sys.argv[1]: 
          daemon.stop() 
        elif 'restart' == sys.argv[1]: 
          daemon.restart() 
        else: 
          print "Unknown command" 
          sys.exit(2) 
        sys.exit(0) 
      else: 
        print "usage: %s start|stop|restart" % sys.argv[0] 
        sys.exit(2) 
0

對我來說,它可以有效地防止通過PID文件啓動第二個實例。你正確使用它嗎?我的例子是基於什麼我發現在the PEP 3143 reference和來源:

#!/usr/bin/env python 

import daemon, os, time, lockfile 

with daemon.DaemonContext(
    pidfile=lockfile.FileLock('./pydaemon.pid'), 
    working_directory=os.getcwd()): 
    for i in range(10): 
    with open('./daemon.log', 'a') as logFile: 
     logFile.write('%s %s\n' % (os.getpid(), i)) 
    time.sleep(1) 

如果我開始有一次,它創建的PID鎖定文件。如果我第二次開始,第二次睡覺,直到第一次完成;正常的守護進程不會完成,所以這有效地阻止了第二個實例。但是,如果第一個守護進程終止,則第二個守護進程開始。