linux主要使用supervise来管理常驻进程。基于supervise的两个比较重要的工具是Daemontools和Supervisor。
实际上,supervise也算Daemontools的一个工具。Daemontools是svscanboot,svscan,supervise,svc,svok,svstat等一系列工具的合集。
为什么使用Daemontools
参考这里
- 增加删除service
只需要在/service中删除或增加link即可 - 快速启动
在/service中增加服务, 即可自动在五秒内完成启动 - 可靠重启
service down掉之后,自动重启 - 简单可靠的控制
配置好 /service 之后, 使用svc命令,可以控制service daemon。 比如:
- svc -h /service/yourdaemon:
sends HUP - svc -t /service/yourdaemon:
sends TERM, and automatically restarts the daemon after it dies
*svc -d /service/yourdaemon:
sends TERM, and leaves the service down - svc -u /service/yourdaemon:
brings the service back up - svc -o /service/yourdaemon:
runs the service once
- 干净的进程状态
重启的service进程,跟第一次启动的一样干净,纯洁无暇 - 可移植
通过配置 /service,程序能在各个linux系统(Linux, BSD, Solaris, etc)上,按相同的方式运行
安装 和 使用
NOTE: 必须使用 root 运行所有的东西
- Step 1 安装:
mkdir -p /package
chmod 1755 /package
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar -xpf daemontools-0.76.tar.gz
rm -f daemontools-0.76.tar.gz
cd admin/daemontools-0.76
package/install
如果 package/install
失败,则编辑 ./src/conf-cc
文件,增加-include errno.h/
:
ed ./src/conf-cc
1s/$/ -include errno.h/
wq
或者
vim ./src/conf-cc
增加gcc配置 -include errno.h
然后重试package/install
安装
- Step 2 启动:
启动 Daemontools
apt-get install csh "(for Ubuntu/Debian users)"
csh -cf '/command/svscanboot &'
设置 Daemontools 自启动(on system boot)
sed -i "1 a\csh -cf '/command/svscanboot &'" /etc/rc.local
chmod +x /etc/rc.local
- Step 3 创建service:
创建 Services 目录,并链接到/service
。 下例,创建服务 在/services
mkdir /services
mkdir /services/somerandomservice
echo -e '#!/bin/sh\nexec somerandomcommand' > /services/somerandomservice/run
chmod 755 /services/somerandomservice/run
ln -s /services/somerandomservice/ /service/
创建链接到 /service 目录, daemontools就会启动service, 这个时候可以检查service的uptime
svstat /service/somerandomservice
可以知道service的状态、pid和运行时间
(note: 如果service的运行时间小于1秒,则可能是run脚本出错,需要调试)
- Step 4 指定用户:
使用特定用户运行service, 与上面的运行类似,不过要使用setuidgid
指定用户
mkdir /services/somerandomuserservice
ed /services/somerandomuserservice/run
a
#!/bin/sh
exec setuidgid somerandomuser somerandomcommand
.
w!
chmod 755 %
q
ln -s /services/somerandomuserservice/ /service/
(note: 以上使用ed
编辑,也可以使用其他编辑,实现一样的目的)
除了通过指定uidgid,也可以通过全登录的方式:
mkdir /services/somerandomuserservice
ed /services/somerandomuserservice/run
a
#!/bin/sh
exec su - somerandomuser -c 'exec somerandomcommand'
.
w!
chmod 755 %
q
ln -s /services/somerandomuserservice/ /service/
- Step 5 logger:
配置multilog, 来对service打logger
adduser logger
mkdir /services/somerandomservice/log
mkdir /services/somerandomservice/log/main
chown logger /services/somerandomservice/log/main
ed /services/somerandomservice/log/run
a
#!/bin/sh
exec setuidgid logger multilog t ./main
.
w!
chmod 755 %
q
- Step 6 Debug:
检查 run 脚本
cd /service/somerandomservice
svc -d .
./run
检查,修复bug之后,使用svc -u /service/somerandomservice
启动服务
- Step 6 检查日志:
cd /service/somerandomservice
tail -n5 log/main/current
- Step 7 重启service:
svc -t /service/somerandomservice
- Step 8 删除service:
rm /service/somerandomservice
svc -dx /services/somerandomservice