Runit 使用介绍

发布时间: 更新时间: 总字数:722 阅读时间:2m 作者: IP上海 分享 网址

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
    • 监听 run 脚本
#!/bin/sh -e
exec 2>&1
exec chpst -u USER COMMAND
  • chpst runs a program with a changed process state/运行进程状态改变的程序
    • man chpst
    • 用来切换普通用户来run脚本
  • svlogd 守护进程将日志信息写到 LOGDIR 目录中
    • 监听 run 脚本
#!/bin/sh
exec chpst -u USER svlogd -tt LOGDIR
  • runsv starts and monitors a service and optionally an appendant log service
    • man runsv

启动服务

  • runit.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

扩展

  • 类似的工具:rekcod、runlike

参考

  1. http://smarden.org/runit/
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数