在我的警报.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,将是一个密友
我看到这一点的几种实现方式:
检查pidfile是否存在->;如果存在,则退出并显示错误消息,如“如果您确定没有进程正在运行,则返回pid file exists rm it”
检查pidfile是否存在->;如果存在,检查具有该pid的进程是否存在->;如果是这样,则告诉用户“进程正在运行…”。PID号发生冲突(重新用于另一个进程)的风险非常小,以至于被忽略;告诉用户如何在发生错误时重新启动程序
提示:要检查进程是否存在,可以检查
/proc/<pid>
目录另外,请确保在脚本退出时尽一切可能删除pidfile,例如:
在
try .. finally
中包装代码:您甚至可以安装信号处理程序(通过
signal
模块)在接收到通常不会引发异常但直接退出的信号时删除pidfile。^{} 库是PEP 3143“标准守护进程库”的参考实现,它通过在传递给} 库)来处理此问题。底层操作系统保证在守护进程退出时释放文件锁,即使它不干净地退出。下面是一个简单的用法示例:
DaemonContext
对象的pid文件上使用文件锁(通过^{因此,如果一个新实例启动,它就不必确定创建现有pid文件的进程是否仍在通过pid本身运行;如果它能够获取文件锁,那么其他实例就不会运行(因为它们已经获得了锁)。如果无法获取锁,则必须运行另一个守护进程实例。在
遇到麻烦的唯一方法是,如果有人在守护进程运行时手动删除了pid文件。但我认为你不必担心有人故意用这种方式破坏东西。在
理想情况下,
python-daemon
将是标准库的一部分,这也是pep3143的最初目标。不幸的是,政治公众人物被推迟了,基本上是因为没有人愿意实际完成加入标准库所需的剩余工作:相关问题 更多 >
编程相关推荐