python
  • daemon
  • python-daemon
  • 2014-09-30 66 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。

    相关问题