【问题标题】:Python daemonizePython 守护进程
【发布时间】:2010-08-01 20:59:49
【问题描述】:

我想守护一个 python 进程,现在想问问让守护进程运行是否是一种好习惯,比如父进程并调用另一个打开 10-30 个线程的类。

我正计划为一组服务器编写一个监控脚本,并希望每 5 分钟检查一次每台服务器,每台服务器每 5 分钟检查一次。

我想这样(有点说话,ps auxf 样式输出):

|monitor-daemon.py
 \-check-server.py
 \-check-server.py

....

谢谢!

【问题讨论】:

    标签: python daemon


    【解决方案1】:

    【讨论】:

    • 是的,使用 python-daemon 代替 supervisord! python-daemon 实现了 PEP 3143 “标准守护进程库”的良好守护进程规范:python.org/dev/peps/pep-3143
    • 你仍然可以在 python-daemon 中使用 supervisor ;-)
    【解决方案2】:

    您可以为此使用supervisord。您可以配置任务以响应事件。事件可以手动创建,也可以通过监控进程或定期自动创建。

    它是完全可定制的,并且是用 Python 编写的。

    例子:

    [program:your_daemon_name]
    command=your_daemon_process
    # Add extra options here according to the manual...
    
    [eventlistener:your_monitor_name]
    command=your_monitor_process
    events=PROCESS_STATE_RUNNING # Will be triggered after a program changes from starting to running
    # Add extra options here according to the manual...
    

    或者,如果您希望事件监听器响应流程输出,请使用事件 PROCESS_COMMUNICATION_STDOUTTICK_60 每分钟检查一次。日志可以重定向到文件等,因此您可以随时查看状态。

    【讨论】:

    • 谢谢,但这对我来说似乎有点过头了(此时)-如果您对以下内容有任何建议:(对不起,如果重复我自己)-守护程序已启动,检查一切是否正常-调用(示例) MyMonitor().check() - MyMonitor.check() 有任务 - 从数据库(SQLite/MySQL)获取数据 - 传递数据并为每个数据条目打开线程 - 基于输出进一步的操作(失败的端口 - 发送电子邮件) - 关闭创建的线程 抱歉,这种风格如此 n00bish 但想在使用其他模块之前检查一切是否到位。
    • 我添加了一个示例 abiko,也许这会有所帮助。请参阅文档以获取示例事件侦听器:supervisord.org/…
    • 是的,supervisord 太过分而且过于复杂。您最好按照备用答案中的建议使用pypi.python.org/pypi/python-daemon
    【解决方案3】:

    创建您自己的daemonize 函数真的没有什么:Unix 环境中的高级编程(第 2 版)的源代码是免费提供的:http://www.apuebook.com/src.tar.gz——您正在寻找apue.2e/daemons/init.c 文件。

    有一个small helper program 负责创建适当的守护进程的所有工作,它可以用来包装任意程序;这可能会节省一些麻烦。

    【讨论】: