使用Daemontools监控管理服务

linux主要使用supervise来管理常驻进程。基于supervise的两个比较重要的工具是DaemontoolsSupervisor
实际上,supervise也算Daemontools的一个工具。Daemontools是svscanboot,svscan,supervise,svc,svok,svstat等一系列工具的合集。

为什么使用Daemontools

参考这里

Paste_Image.png
  1. 增加删除service
    只需要在/service中删除或增加link即可
  2. 快速启动
    在/service中增加服务, 即可自动在五秒内完成启动
  3. 可靠重启
    service down掉之后,自动重启
  4. 简单可靠的控制
    配置好 /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
  1. 干净的进程状态
    重启的service进程,跟第一次启动的一样干净,纯洁无暇
  2. 可移植
    通过配置 /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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,758评论 17 134
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 158,324评论 24 688
  • muahao阅读 1,727评论 0 3
  • 今天状态不错,终于精力充沛的5:00起来了,早晚双闹钟的办法是很有效的,(晚上设置两个提醒自己22点前睡觉的闹钟,...
    罗理罗嗦阅读 87评论 0 0
  • 女主前后变化真的很大。 这张是最惊艳我的装扮。 其实女主和意大利男友相处的时光真的好甜啊。 尤其意大利男说要请她看...
    芽君heart阅读 159评论 0 0