博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的Daemon管理器-zdaemon
阅读量:6219 次
发布时间:2019-06-21

本文共 3317 字,大约阅读时间需要 11 分钟。

Python的Daemon管理器-zdaemon

作者:

日期:

gashero
2009-09-07

经常开发服务器程序,所以一个强悍的daemon托管程序很重要,之前用过的最靠谱的方式就是twisted自带的twistd了。不过想要让它托管,需要对程序做大量的修改才行,实在是不方便。

总得来说需求是:能够启动进入daemon模式,能够记录所有屏幕打印日志和异常日志。

zdaemon是ZOPE项目的子项目之一。

项目主页:

注意:如果安装时没有ez_setup.py那套东西,安装完成以后就没有zdaemon命令。

zdaemon的主要入口是一个 zdaemon

程序。

提供的子命令如下:

  1. start
    :启动进程作为daemon
  2. stop
    :停止进程
  3. restart
    :重启进程
  4. status
    :查看进程运行状态
  5. foreground
    fg
    :运行程序
  6. kill signal
    :发送signal到daemon进程
  7. reopen_transcript
    :重新打开日志
  8. help command
    :显示命令的帮助

前台启动,-p选项指定要运行的程序:

$ zdaemon -p "echo hello world" fg

守护进程启动:

$ zdaemon -p "sleep 100" start. .daemon process started, pid=819

检查守护进程状态:

$ zdaemon -p "sleep 100" statusprogram running; pid=819

停止守护进程:

$ zdaemon -p "sleep 100" stop. .daemon process stopped$ zdaemon -p "sleep 100" statusdaemon manager not running

简历配置文件,指定程序:

$ cat zd.conf
program sleep 100
$ zdaemon -Czd.conf start. .daemon process started, pid=1136$ zdaemon -Czd.conf stop. .daemon process stopped

这时会在当前目录产生文件 zdsock

,给zdaemon进行内部管理用。

配置文件中指定sock文件位置:

program sleep 100socket-name /tmp/demo.zdsock

可以通过zdaemon传参数给应用程序:

$ cat zd.conf
program sleepsocket-name /tmp/demo.zdsock
$ zdaemon -Czd.conf start 100. .daemon process started, pid=1149

在配置文件中传递环境变量:

program env socket-name /tmp/demo.zdsock
LD_LIBRARY_PATH /home/foo/lib HOME /home/foo

在daemon运行时,程序的标准输入会被关闭,标准输出和错误输出会收到控制,可选的重定向到标准输出或文件。这一切由transcript选项控制,对于长时间运行的程序很必要。

看例子配置:

program tail -f data transcript log

运行中可以对日志文件重命名,而因为zdaemon仍然打开那个文件,所以输出依旧会到那个文件中,哪怕名字改变了。这时可以告知zdaemon重新打开日志,这样就又可以输出到原来定义的日志文件那里了:

zdaemon -Czd.conf reopen_transcript

以下参数可以用于配置文件的runner段或命令行选项:

  1. program

    、命令行 -p
    / --program
    :这个选项给出需要运行的程序

  2. socket-name

    、命令行 -s
    / --socket-name
    :指定Unix套接字路径

  3. daemon

    、命令行 -d
    / --daemon
    :如果为true则在后台运行,缺省为开启。子进程会做如下工作:

    1. 如果 directory
      选项存在,则切换到那个目录
    2. 重定向 stdin、stdout、stderr到/dev/null
    3. 调用setsid(),以便作为会话的主进程
    4. 调用umask()
  4. directory

    、命令行 -z
    / --directory
    :指定守护进程运行时所在目录

  5. backoff-limit

    、命令行 -b
    / --backoff-limit
    :当子进程挂了,zdaemon会在1秒钟延时以后重启它。当子进程再次挂了,延时会再增加1秒。当延时增加到backoff-limit时,依赖于 forever
    选项的值。如果 forever
    为false,zdaemon会放弃并退出。一个经常挂掉的子进程,会限制只重启backoff-limit次。如果 forever
    为true,zdaemon会继续尝试重启,保持backoff-limit的时延。如果子进程保持时间超过backoff-limit秒,延时会重置为1秒。缺省为10。

  6. forever

    、命令行 -f
    --forever
    :如果为true,则让挂掉的子进程一直重启,如果为false,则在backoff-limit次后放弃而退出。缺省为禁用。

  7. exit-codes

    、命令行 -x
    --exit-codes
    :如果子进程的退出代码在列表中,则zdaemon不会将其重启。默认值为 0,2
    ,分别代表正常结束和命令语法错误。这些情况下重启也没啥用。这个行为重载了 backoff-limit
    forever
    选项。想要禁用它,可以设置值为空列表。

  8. user

    、命令行 -u
    --user
    :当root使用zdaemon启动时,这个选项指定实际运行用户,参数可以用用户名或者用户ID。user和group都是从正确的密码入口使用 setuid()
    setgid()
    设置的。这个操作会在zdaemon的所有其他操作之前进行,除了命令行参数解析。注意当zdaemon不是以root启动时,指定这个选项会出错。注意事件日志会在 setuid()
    之前调用,这个是好还是不好呢?

  9. umask

    、命令行 -m
    --umask
    :当使用守护进程时,用8进制指定umask。

  10. default-to-interactive

    、命令行 -i
    --interactive
    :如果指定了该选项为true,在没有附加命令参数时zdaemon进入交互模式。如果为false,你必须指定命令行参数才能进入交互模式。缺省启用。

  11. logfile

    :指定"logtail"命令的缺省日志文件。注意这不是zdaemon记录日志信息的日志文件。那个日志是由<eventlog>段描述的。

  12. transcript

    :记录副本日志的文件名,命令的所有输出副本会记录进去。如果没有指定命令输出会被丢弃。仅在daemon选项有效时才有效。

  13. prompt

    :控制程序使用的提示符。缺省由应用提供。

(注意,一些其他选项仅对旧配置文件有效,但是不再需要了,而且会被忽略。)

除了在runner段,还可以使用eventlog段指定日志文件:

path /var/log/foo/foo.log
path STDOUT

这个例子中,日志被发送到文件和标准输出。zdaemon的日志输出通常没什么意思,但是你可以用于调试。

转载地址:http://mgoja.baihongyu.com/

你可能感兴趣的文章
App开发中甲乙方冲突会闹出啥后果?H5 APP 开发可以改变现状吗
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
Myeclipes快捷键
查看>>
我的友情链接
查看>>
ToRPC:一个双向RPC的Python实现
查看>>
我的友情链接
查看>>
nginx在reload时候报错invalid PID number
查看>>
神经网络和深度学习-第二周神经网络基础-第二节:Logistic回归
查看>>
Myeclipse代码提示及如何设置自动提示
查看>>
c/c++中保留两位有效数字
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
由String类的Split方法所遇到的两个问题
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
自制操作系统Antz day11——实现shell(下)命令响应
查看>>
windows查看端口占用
查看>>