用 python_daemon 来快速完成 unix daemon

代码请见: https://github.com/chunshengster/py_daemon

在系统运维以及后台程序的开发中,我们经常会使用各种脚本来快速完成一些程序来定时执行或程序执行,定时执行的程序我们常常会放到cron中,通过cron来启动。
而定时启动执行的程序也往往会给我们带来困扰,不如,定时间隔的问题。大多数情况我们需要程序在下一次执行前需要上一次的执行是已经完成的(或失败,或成功),为解决这个问题,我们还需要在业务逻辑前增加类似进程检查的代码:如果当前进程表中存在同名程序进程,则直接退出;如果不,则进入我们需要的那些个业务逻辑代码里。

如果程序可以持续执行,我们往往会在脚本启动时使用这样的代码:/tmp/test.sh > /tmp/test.log 2>&1是的 2>&1 是shell标准支持。只不过

1,我不喜欢这种风格

2,关闭进程时需要手工kill ,我喜欢 init.d 的模式  start | stop 多帅!

再来了解 PEP 3143 中对 daemon行为的描述(http://www.python.org/dev/peps/pep-3143/#correct-daemon-behaviour

  • Close all open file descriptors.              (关闭所有打开的文件描述符。)
  • Change current working directory.       (改变当前工作目录。)
  • Reset the file access creation mask.   (重设文件访问创建掩码。)
  • Run in the background.                         (在后台运行。)
  • Disassociate from process group.       (脱离进程组。)
  • Ignore terminal I/O signals.                  (忽略终端I / O信号。)
  • Disassociate from control terminal.     (脱离控制终端。)
  • Don’t reacquire a control terminal.       (不要重新获得一个控制终端。)
  • Correctly handle the following circumstances:      (正确处理好以下情况:)
    • Started by System V init process.                (开始由System V init进程。)
    • Daemon termination by SIGTERM signal.   (SIGTERM信号守护程序终止。)
    • Children generate SIGCLD signal.               (子进程产生SIGCLD信号。)

下面进入使用 python_daemon 模块来快速的写一个daemon:

从上述代码可见其简单, 使用 python_daemon写 daemon 程序只需要简单的3步:

1, 引入 daemon runner

2, 完成业务daemon app的代码,需要注意的是 daemon app中需要设置的参数:

3, 用 DaemonRunner将 daemon app实例化

完成!

 当然,使用unix标准的 2>&1 的方式也无可厚非,看洁癖的程度吧。
还有其他的一些方式,比如 nohup 命令来启动程序。
python还有其他的一些模块可以做类似的事情,详情可参考 PEP 3143
———————–分割线—————————-
补充一些参考的代码

Creating a daemon the Python way (Python recipe): http://code.activestate.com/recipes/278731/

A simple unix/linux daemon in Python :http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

YapDi – Yet another python Daemon implementation:https://github.com/kasun/YapDi

 

PS: 我个人认为python_daemon 的一个bug:
     被重定向到文件的 sys.stderr 和 sys.stdout 在打开的时候使用的是 ‘w+’ flag,这样会在程序重启的过程中,清空原有的日志文件,这个是碉堡的一件事情。
|2|left
此条目发表在Python分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注