Python精灵:一直运行一个精灵检查

2024-10-03 11:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的警报.py在

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这样的脚本名称。有标准的方法吗?在

注:剧本,我的警报.py,将是一个密友


Tags: 文件runpyimportiftime进程os
2条回答

我看到这一点的几种实现方式:

  1. 检查pidfile是否存在->;如果存在,则退出并显示错误消息,如“如果您确定没有进程正在运行,则返回pid file exists rm it”

  2. 检查pidfile是否存在->;如果存在,检查具有该pid的进程是否存在->;如果是这样,则告诉用户“进程正在运行…”。PID号发生冲突(重新用于另一个进程)的风险非常小,以至于被忽略;告诉用户如何在发生错误时重新启动程序

提示:要检查进程是否存在,可以检查/proc/<pid>目录

另外,请确保在脚本退出时尽一切可能删除pidfile,例如:

  1. try .. finally中包装代码:

    # Check & create pidfile
    try:
        # your application logic
    
    finally:
        # remove pidfile
    
  2. 您甚至可以安装信号处理程序(通过signal模块)在接收到通常不会引发异常但直接退出的信号时删除pidfile。

^{}库是PEP 3143“标准守护进程库”的参考实现,它通过在传递给DaemonContext对象的pid文件上使用文件锁(通过^{}库)来处理此问题。底层操作系统保证在守护进程退出时释放文件锁,即使它不干净地退出。下面是一个简单的用法示例:

import daemon
from daemon.pidfile import PIDLockFile

context = daemon.DaemonContext(
    pidfile= PIDLockFile('/var/run/spam.pid'),
    )

with context:
    main()

因此,如果一个新实例启动,它就不必确定创建现有pid文件的进程是否仍在通过pid本身运行;如果它能够获取文件锁,那么其他实例就不会运行(因为它们已经获得了锁)。如果无法获取锁,则必须运行另一个守护进程实例。在

遇到麻烦的唯一方法是,如果有人在守护进程运行时手动删除了pid文件。但我认为你不必担心有人故意用这种方式破坏东西。在

理想情况下,python-daemon将是标准库的一部分,这也是pep3143的最初目标。不幸的是,政治公众人物被推迟了,基本上是因为没有人愿意实际完成加入标准库所需的剩余工作:

Further exploration of the concepts covered in this PEP has been deferred for lack of a current champion interested in promoting the goals of the PEP and collecting and incorporating feedback, and with sufficient available time to do so effectively.

相关问题 更多 >