runit
是带有服务监督功能的 UNIX 启动管理器,常用来在docker容器中启动多个服务
介绍
runit 的作用:
- 启动服务
- 监控服务:当服务发生意外中断时,自动重启服务
- 监听服务日志
runit 分三个阶段执行系统启动、运行和关闭:
阶段 1
:runit 启动 /etc/runit/1
并等待其终止。系统的一次性初始化任务在此完成。/etc/runit/1
拥有对 /dev/console 的完全控制权,以便在一次性初始化任务失败时启动应急 shell。
阶段 2
:runit 启动 /etc/runit/2
,在系统停止或重启之前,它不应返回;如果它崩溃了,它将被重启。通常,/etc/runit/2
会运行 runsvdir
- 在第二阶段,runit 可以选择处理 INT 信号(Linux/i386 上为
ctrl-alt-del
键盘请求)
阶段 3
:如果 runit 被告知停止或重启系统,或阶段 2 无错误返回,它将终止正在运行的阶段 2,并运行 /etc/runit/3
。关机、停止或重启系统的任务在此完成。
使用
安装
apt-get install runit runit-systemd -y
组成
runit-systemd
包提供 runit.service
文件
runsvdir
启动服务:runsvdir -P /etc/service log:.......
man runsvdir
- 服务默认监听
/etc/service/
的配置
- 当检查到新的配置文件时,会自动启动并监视一组
runsv
进程
runsv
#!/bin/sh -e
exec 2>&1
exec chpst -u USER COMMAND
chpst
runs a program with a changed process state/运行进程状态改变的程序
svlogd
守护进程将日志信息写到 LOGDIR 目录中
#!/bin/sh
exec chpst -u USER svlogd -tt LOGDIR
runsv
starts and monitors a service and optionally an appendant log service
启动服务
$ systemctl cat runit.service
# /lib/systemd/system/runit.service
[Unit]
Description=Runit service supervision
Documentation=http://smarden.org/runit/
[Service]
ExecStart=/etc/runit/2
KillSignal=SIGHUP
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
- 实际
/etc/runit/2
中启动命令(可以放到docker的 entrypoint.sh
中)
runsvdir -P /etc/service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................'
demo
$ mkdir /etc/service/demo
$ useradd foo
$ chown foo:foo /etc/service/demo
$ su foo
$ cat /etc/service/demo/foo-service.sh
#!/bin/bash
echo "Started service..."
for i in {1..30}
do
echo "Doing stuff..."
sleep 1
done
echo "Oh no I crashed..." >&2
exit 1
$ chmod +x /etc/service/demo/foo-service.sh
$ cat /etc/service/demo/run
#!/bin/sh -e
exec 2>&1
exec chpst -u foo /etc/service/demo/foo-service.sh
$ chmod a+x /etc/service/demo/run
$ cat mkdir /etc/runit/demo/log
$ chmod +x /etc/runit/demo/log/run
#!/bin/sh -e
exec 2>&1
exec chpst -u foo svlogd -tt /var/logs/demo
$ mkdir /var/logs/demo
$ chown foo:foor -R /var/logs/demo
# 启动服务
# 查看服务状态
sv status demo
sv stop demo
sv restart demo
扩展