监控重启进程的方案有很多种:
- 最简单的方法,写个脚本fork进程运行,然后waitpid,如果获pid后就再次启动
- 最土的方法,配置cron任务,固定时间运行脚本检查进程是否存在,不存在则启动
-
百度使用qmail里的supervised程序,通过supervised监管进程。
- 优点:supervised可以启动daemon程序,对于非daemon需要采用nohup的方式启动。
- 缺点:每个进程都要配置自己的supervised,无法做到统一管理。
- 百度对supervised进行过改造,线上有2个分支,基本功能类似,如:进程挂掉后的重启次数、重启前调用脚本处理、重启时报警功能。
-
使用supervisord
supervisord是python写的进程监控工具(http://supervisord.org/),网上也有很详细的中文教程,提供2个工具supervisord和supervisorctl- supervisord 用来启动supervisord
- supervisorctl start/stop/restart/status [process_name] 对进程进行控制和状态查看
- 提供一个http server,能够在浏览器查看和操作进程启停。同时提供xmlrpc功能,可以自己编写CLI程序远程call supervisord的接口
- 缺点:不能对daemon程序监控,supervisord退出后会使被监管的进程也退出
-
使用monit
monit的功能基本上和supervisord类似,占用内存也非常少,大概在2M左右,不过实在不喜欢它的进程配置语法。- 优点:支持进程资源只用判断,当进程使用cpu/mem超过多少进行重启。当进程异常不断重启时,也支持各种条件。
-
使用god
god的功能和supervisord、monit比较类似,接下来会重点介绍God的相关功能
God 进程监控
God是由ruby编写的进程监控框架(http://godrb.com),安装、配置都很简单,大概的功能如下:
优点:
- 启动和控制都使用一个命令: god
- 可以管理daemon和非daemon进程
- 可以设置进程的uid、env、dir、log等参数
- 进程配置文件和supervisord类似,但使用ruby的语法。支持类似monit的,对进程使用资源和各种条件的控制
- 支持进程配置动态加载功能
- 支持把多个进程配置拆分成单独的配置文件,类似include功能
- 支持通知功能,包括:Webhook、Email、Twitter、Jabber、Campfire等多个接口
- 根据PID的方式进行监控,GOD可以随便升级和重启
缺点:
- 不提供web端和rpc接口
- log查看stdrr/stdout 功能似乎不能正常work,不过我基本上用不到这个功能
- linux下采用2种方式检测进程poll和event。root默认启用event模式,如果启动的进程错误,它会注册一个proc_exit事件,但无法响应。
一、 安装
需要有ruby环境,>= ruby 1.8.7,支持redhat、ubuntu、centos
1
|
[sudo] gem install god
|
二、 一个简单的实例
-
编写一个简单的ruby程序,hello.rb:
1234loop doputs “hello God!”sleep 5end
-
编写进程配置文件,hello.god:
123456God.watch do |w|w.name = “hello”w.start = “ruby /home/work/ruby/hello.rb”w.keepalive(:memory_max => 150.megabytes,:cpu_max => 50.percent)end
-
启动god,加载配置,有2种方式:
- 启动god同时加载配置: god -c hello.god
- 先启动god,再加载配置: god && god load hello.god
这个时候可以用ps查看,hello.rb已经启动起来。使用god status 可以查看到状态如下:
1
|
hello: up
|
在hello.god配置中,我们配置了:memory_max和:cpu_max,当hello.rb使用cpu或mem超过我们配置的内容时,god就会重启该进程。
使用如下命令,对进程进行各种控制,具体见god –help:
1
|
god start/stop/restart/status/monitor/unmonitor/remove/log [process_name]
|
三、 进一步使用
-
配置文件中加载其他god文件
1God.load “/home/god/conf/*.god”
- 已经启动god后,使用god load 动态加载配置
- god pid文件,root启动时在/var/run/god, 普通账号在~/.god/
- god -D 非daemon方式运行God
- god status 看到的状态有3种:up、unmonitored、error(一般不会出现)
- god支持设置uid,pid,dir,chroot,env等各种参数,详细见godrb.com
-
进程启动触发邮件发送,配置如下:
1234567891011121314151617God::Contacts::Email.defaults do |d|d.from_email = ‘god@xxx.com’d.from_name = ‘God’d.delivery_method = :sendmailendGod.contact(:email) do |c|c.name = ‘wilbur’c.group = ‘developers’c.to_email = ‘wilbur@xxx.com’endw.transition(:up, :start) do |on|on.condition(:process_exits) do |c|c.notify = ‘wilbur’endend
四、 经验分享
- 实际测试时,只有log功能不能正常工作
-
测试配置一个错误的w.start = “ruby ddd.rb”, ddd.rb不存在
-
在root环境下god默认使用event模式,由于该进程启动命令错误,注册一个proc_exit(pid_num)后,没有再次启动.
使用god status 查看,进程一直是up状态,但查看进程pid不存在 -
使用poll模式进行进程监控,查看god日志。god不断重启该进程
使用god status查看,进程也是up状态。查看代码,因为god在启动进程的时候会将它状态变成up状态,下次周期检查时,发现进程挂了,又重启,又将状态修改为up状态。
所以在任何时刻下查看进程都是up状态,可以使用如下配置方式进行解决:123456789101112131415161718192021God.watch do |w|w.name = “hello”w.start = “ruby /home/work/ruby/hello.rb”w.keepalive(:memory_max => 150.megabytes,:cpu_max => 50.percent)w.lifecycle do |on|on.condition(:flapping) do |c|c.to_state = [:start, :restart]c.times = 5c.within = 5.minutec.transition = :unmonitoredc.retry_in = 10.minutesc.retry_times = 5c.retry_within = 2.hoursendendend#当进程异常,会导致god不断重启#使用:flapping条件#5分钟内start或者restart进程 5次,如果启动失败,修改状态为unmonitored#10分钟后再次尝试启动,如果2个小时内,尝试5次都失败,彻底放弃
-
在root环境下god默认使用event模式,由于该进程启动命令错误,注册一个proc_exit(pid_num)后,没有再次启动.
- god使用ruby的drb进行通信,所以很容易写一个web server+xmlrpc功能,通过drb控制god.
- god load对.god内容正确性没有检查,可以使用god load 加载一个ruby程序。
原文链接:http://zoomq.qiniudn.com/ZQScrapBook/ZqFLOSS/tree/item20081015105037-frameset.html
原创文章,作者:追马,如若转载,请注明出处:http://www.178linux.com/468