用python写管理系统(Python的Daemon管理器zdaemon)
Python的Daemon管理器-zdaemon
作者:
日期:
gashero 2009-09-071简介
经常开发服务器程序 ,所以一个强悍的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 running4使用配置文件管理
简历配置文件 ,指定程序:
$ 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_transcript5参考文档
以下参数可以用于配置文件的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的日志输出通常没什么意思 ,但是你可以用于调试。
如果 directory
选项存在 ,则切换到那个目录 重定向 stdin、stdout 、stderr到/dev/null 调用setsid(),以便作为会话的主进程 调用umask()创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!