python守护进程的单个实例(使用python-daemon)

时间:2014-02-24 14:21:29

标签: python linux init.d python-daemon

我想创建一个永远运行的程序,一次只运行一个实例,并且可以使用init.d脚本启动。 python-daemon似乎是一个很好的选择,因为它是PEP 3143的参考实现。

无论如何我无法理解PID锁定文件的用途,因为它不会阻止程序运行两次。

我应该在init.d脚本中手动检查锁文件是否存在(基于'/etc/init.d/skeleton')?我怎么能杀了它?获取PID文件中的PID号并发送SIGTERM?

非常感谢。

2 个答案:

答案 0 :(得分: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锁定文件。如果我第二次启动它,第二个实例会一直睡到第一次结束;普通守护进程无法完成,因此这有效地阻止了第二个实例。但是,如果第一个守护程序终止,则第二个守护程序启动。

答案 1 :(得分:0)

我最终使用了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)