daemontools & supervise
daemontools
概念:daemontools是用来监控进程的工具。
安装daemontools:
# 下载包
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# 解压
tar -zxvf daemontools-0.76.tar.gz
# 编译。 注意:安装过程中需要创建/service和/command目录,故需要root权限。
cd admin/daemontools-0.76
sudo package/install
# 此时会报错 "/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o"
# 解决:在 src/conf-cc 第一行的最后加上" -include /usr/include/errno.h" 后,重新执行 package/install 即可。
启动daemontools:
/command/svscanboot &
# 说明:
通过"ls /command/"可以看到daemontools下的命令,svscanboot启动之后会启动svscan,svscan启动后会启动supervise。
svscan每隔5s会去检查/service目录,如果有新的服务,则启动新的supervise;如果有supervise意外退出会重启supervise(注:若supervise是正常退出的,则不会重启)。
验证:
ps aux | grep svscan
# 若查询到如下进程,则表示启动成功。
/bin/sh /command/svscanboot
svscan /service
daemontools中的supervise命令:
概念:supervise命令用来监控指定的进程,当监控的进程挂掉后,supervise会自动重启该进程。
格式:supervise xxxx/xxxService # xxxx/xxxService是一个目录,supervise会监控这个目录,该目录下必须包含名称为run的文件。
使用:
第一步:创建服务目录,准备run文件
举例:创建服务目录:/home/work/jxn-test/agent ,将要监控的进程的启动命令需要放到run文件中:
vim /home/work/jxn-test/agent/run
#!/bin/sh
sh realCmd.sh
# 注意:
# 1>服务的启动命令,不能是nohup启动的,因为nohup执行的太快了,最后导致nohup正常结束后,supervise认为nohup进程挂掉了,故会不断地去运行run。
# 2>必须在run脚本的开头写上 #!/bin/sh ,否则报错:supervise: fatal: unable to start /home/work/jxn/my-service/run: exec format error
# 给run文件添加执行权限
chmod 755 run
# 建立链接,方便管理和查看。
ln -sf /home/work/jxn-test/agent /service/
第二步:启动监控
启动监控:svc -u /home/work/jxn-test/agent (或:svc -u /service/agent)
关闭监控:svc -d /home/work/jxn-test/agent
关闭监控并且停止服务:svc -dk /home/work/jxn-test/agent
说明:svc命令是用来控制那些被supervise监控的服务的。svc是间接控制服务的,它实际上是通过控制supervise来控制服务。
格式:svc 参数 xxxx/xxxService
参数:
-u up,启动对该服务的监控。
注:也可以直接使用supervise命令来启动监控:nohup supervise /home/work/jxn-test/agent > svsrun.log 2>&1 &
-d down,停止对该服务的监控,即停止supervise对该服务的监控。
注:服务不会因此而关闭,若我们要关闭服务,则使用-k参数或手动kill掉服务。
-o once,如果该服务没有运行,则启动该服务,之后若该服务挂掉了,supervise也不会再去启动该服务了。
-k kill,给服务发送一个KILL信号。
-x exit,停止对该服务的监控,并且停止该服务的supervise进程,该服务对应的supervise进程停止后,我们就无法使用svc命令了。
注意:我们一般不会使用该参数!如果服务对应的supervise进程被停掉(svc -x 服务目录)或被kill掉,则我们可以使用"nohup supervise 服务目录 & "来重新启动该服务对应的supervise进程。
查看服务的状态:svstat xxxx/xxxService
常见问题:
问题:若不小心将服务目录下的supervise目录删除后,会导致无法使用svc命令:
svc -u /home/work/jxn-test/agent
提示:svc: warning: unable to control /home/work/jxn-test/agent: file does not exist
svstat /home/work/jxn-test/agent
提示:/home/work/jxn-test/agent: unable to open supervise/ok: file does not exist
解决:
先kill掉该服务之前的supervise进程:ps aux | grep "supervise /home/work/jxn-test/agent" | grep -v grep | awk '{print $2}' | xargs kill -9
然后直接使用nohup supervise /home/work/jxn-test/agent > svsrun.log 2>&1 & 启动,然后会自动生成supervise目录,我们就可以使用svc命令了。