设为首页 收藏本站
查看: 559|回复: 0

[经验分享] Python的Daemon管理器-zdaemon

[复制链接]

尚未签到

发表于 2017-5-3 10:45:02 | 显示全部楼层 |阅读模式
Python的Daemon管理器-zdaemon


作者:
gashero


日期:
2009-09-07

目录




  • 1   简介

  • 2   命令接口

  • 3   命令行控制

  • 4   使用配置文件管理

  • 5   参考文档




1   简介

  经常开发服务器程序,所以一个强悍的daemon托管程序很重要,之前用过的最靠谱的方式就是twisted自带的twistd了。不过想要让它托管,需要对程序做大量的修改才行,实在是不方便。
  总得来说需求是:能够启动进入daemon模式,能够记录所有屏幕打印日志和异常日志。
  zdaemon是ZOPE项目的子项目之一。
  项目主页: http://pypi.python.org/pypi/zdaemon

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




2   命令接口

  zdaemon的主要入口是一个 zdaemon
程序。
  提供的子命令如下:



  • start
    :启动进程作为daemon

  • stop
    :停止进程

  • restart
    :重启进程

  • status
    :查看进程运行状态

  • foreground
    或 fg
    :运行程序

  • kill signal
    :发送signal到daemon进程

  • reopen_transcript
    :重新打开日志

  • help command
    :显示命令的帮助




3   命令行控制

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

$ zdaemon -p "echo hello world" fg

  守护进程启动:

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

  检查守护进程状态:

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

  停止守护进程:

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




4   使用配置文件管理

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

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

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

,给zdaemon进行内部管理用。
  配置文件中指定sock文件位置:

<runner>
program sleep 100
socket-name /tmp/demo.zdsock
</runner>

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

$ cat zd.conf
<runner>
program sleep
socket-name /tmp/demo.zdsock
</runner>
$ zdaemon -Czd.conf start 100
. .
daemon process started, pid=1149

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

<runner>
program env
socket-name /tmp/demo.zdsock
</runner>
<environment>
LD_LIBRARY_PATH /home/foo/lib
HOME /home/foo
</environment>

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

<runner>
program tail -f data
transcript log
</runner>

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

zdaemon -Czd.conf reopen_transcript




5   参考文档

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



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


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


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


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




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


  • 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。


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


  • exit-codes
    、命令行 -x
    或 --exit-codes
    :如果子进程的退出代码在列表中,则zdaemon不会将其重启。默认值为 0,2

    ,分别代表正常结束和命令语法错误。这些情况下重启也没啥用。这个行为重载了 backoff-limit
    和 forever
    选项。想要禁用它,可以设置值为空列表。


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


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


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


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


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


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

  (注意,一些其他选项仅对旧配置文件有效,但是不再需要了,而且会被忽略。)
  除了在runner段,还可以使用eventlog段指定日志文件:

<eventlog>
<logfile>
path /var/log/foo/foo.log
</logfile>
<logfile>
path STDOUT
</logfile>
</eventlog>

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372471-1-1.html 上篇帖子: Python自动化运维开发实战课程方案 下篇帖子: python处理文本文件内容专题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表