2014-02-24 170 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锁定文件。如果我第二次开始,第二次睡觉,直到第一次完成;正常的守护进程不会完成,所以这有效地阻止了第二个实例。但是,如果第一个守护进程终止,则第二个守护进程开始。