最近在工作中用到了daemontools工具来管理服务进程。这里总结一下。
当服务进程因为某些原因(包括kill)挂掉了,daemontools会重新启动这个进程。
安装方法
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar xvzf daemontools-0.76.tar.gz
cd admin/daemontools-0.76
sudo package/install
注意:上面的最后一条命令的package表示daemontools-0.76目录下的package目录,而不是一个package命令(我犯了这个错误,真是。。。,记录一下)。
之所以要使用sudo是因为,install脚本会在根目录/下创建两个目录:/service和/command目录。其中/service目录用来存放被daemontools管理的进程,注意在/service目录下存放的只能是连接。/command命令下存放的是daemontools的一些常用命令。
启动daemontools工具:
/command/svscanboot &
&后台运行
这时看下svs(supervise)的运行情况:
ps -ef | grep svs
这里解释下ps命令的参数ef。一直都在用ps -ef这个命令查看系统中运行的进程,都忘记参数ef的含义了。
从ps -ef | grep svs的输出可以看到svscan作为svscanboot的子进程在运行。而且svscan监听的目录是/service目录。
可以通过pstree -a -p 6927来看看进程树:
其中pstree的参数-a -p的含义如下所示:
daemontools的简单介绍
daemontools是一个守护进程工具,防止用户进程意外退出。daemontools的工具有:
常用的有以下5个:
(1)svscanboot
这个命令一般不用手动输入执行,因为这个一般会随Linux系统的启动而自动启动。像我在Mint17.2安装完daemontools之后会提示我重启系统,当然我没有重启系统,而是使用的上面的方式启动的。看下/etc/rc.local就可以直到它会随Linux的启动而启动:
设置某个进程随系统启动的方法可以参考这个:http://cr.yp.to/daemontools/start.html
svscanboot启动之后会启动svscan,svscan会启动supervise,supervise会启动并监听/service中存放服务目录下的run可执行文件。
(2)svscan
svscan会为/service目录下所有服务启动supervise进程。svscan会为每个服务启动一对supervise服务:一个s子目录(即服务进程的工程目录),其实是个软连接;一个是s子目录下的log目录(如果有的话)。supervise会执行s子目录下的run脚本,并监听run脚本启动的进程,同时会启动s/log目录下的run脚本。这个s/log目录下的run脚本用来输出s目录run脚本的日志到指定目录。svscan每隔5s检查下/service目录,如果有新的服务,则启动新的supervise;如果有supervise意外退出会重新启动supervise。
(3)supervise
supervise用来执行/service目录下服务的run脚本。如果run脚本退出的话,会每隔几秒执行一下。在/service下的服务目录s下会有一个supervise目录用来存放进程状态的二进制格式信息。svstate就会读取这个状态信息。
(4)svc命令
svc opts services
opts是一系列的参数,services是指/service下的服务目录。opts参数如下:
-u : up, 如果services没有运行的话,启动它,如果services停止了,重启它。
-d : down, 如果services正在运行的话,给它发送一个TERM(terminate)信号,然后再发送一个CONT(continue)信号,在它停止后,不再启动它。
-o : once, 如果services没有运行,启动它,但是在它停止后不再启动了。就是只运行一次。
-p : pause, 给services发送一个停止信号。
-c : continue, 给services发送一个CONT信号。
-h : hang up, 给services发送一个HUP信号。
-a : alarm, 给services发送一个ALRM信号。
-i : interrupt, 给services发送一个INT信号。
-t : Terminate, 给services发送一个TERM信号。
-k : kill, 给services发送一个KILL信号。
-x : exit, supervise在services停止后会立刻退出, 但是值得注意的是,如果你在一个稳定的系统中使用了这个选项,你已经开始犯错了:supervise被设计成为永远运行的。
关掉一个服务进程通常使用-dk参数,此时supervise进程并没有关闭,所以依然可以将这个服务进程重启。即使,supervice进程挂掉了,svscan依然会重启supervise,supervise会重新运行服务进程的run脚本。
Interface svc opts services
opts is a series of getopt-style options. services consists of any number of arguments, each argument naming a directory used by supervise.
svc applies all the options to each service in turn. Here are the options:
-u: Up. If the service is not running, start it. If the service stops, restart it.
-d: Down. If the service is running, send it a TERM signal and then a CONT signal. After it stops, do not restart it.
-o: Once. If the service is not running, start it. Do not restart it if it stops.
-p: Pause. Send the service a STOP signal.
-c: Continue. Send the service a CONT signal.
-h: Hangup. Send the service a HUP signal.
-a: Alarm. Send the service an ALRM signal.
-i: Interrupt. Send the service an INT signal.
-t: Terminate. Send the service a TERM signal.
-k: Kill. Send the service a KILL signal.
-x: Exit. supervise will exit as soon as the service is down. If you use this option on a stable system, you’re doing something wrong; supervise is designed to run forever.
(5)svstat
查看服务的状态
参考资料:
1. 进程的守护神 - daemontools
2. 在CentOS 6.4上安装daemontools(守护进程工具)