簡體   English   中英

python守護程序的單個實例(帶有python-daemon)

[英]Single instance of a python daemon (with python-daemon)

我想創建一個永遠運行的程序,一次只能運行一個實例,並且可以使用init.d腳本啟動該程序。 python-daemon似乎是一個不錯的選擇,因為它是PEP 3143的參考實現。

無論如何,我無法理解PID鎖定文件的用途,因為它不會阻止程序運行兩次。

是否應該在init.d腳本(基於'/etc/init.d/skeleton')中手動檢查鎖定文件的存在? 另外我該怎么殺呢? 在PID文件中獲取PID號並發送SIGTERM?

非常感謝。

對我來說,它可以有效地防止通過PID文件啟動第二個實例。 您使用正確嗎? 我的示例基於在PEP 3143參考資料和來源中找到的內容:

#!/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鎖定文件。 如果我第二次啟動它,那么第二個實例將一直休眠直到第一個實例完成為止; 正常的守護程序不會完成,因此這將有效地永久阻止第二個實例。 但是,如果第一個守護程序終止,則啟動第二個守護程序。

我最終使用了Sander Marechal的代碼,該代碼的站點當前已關閉,所以這里是pastebin的鏈接: 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM