Runit

出自 ArchWiki
警告: Arch Linux 仅官方支持 systemd[1] 当使用 runit 时,请在支持请求中提及。

Runit 是一个进程管理器。它包含 runit-init,可以替换 sysv 的 init 作为 pid 1,或者可以从 inittab 或您选择的 init 系统中运行。Runit 简单的工具集合可以用于构建灵活的依赖结构和分布式系统,或者极速的并行运行级别更改(包括初始启动)。Runit 可以用作简单的进程管理器,请参阅 #用户服务 获取示例。

安装

与 systemd 一起使用 runit

使用 BusyBox 的实现

BusyBox 提供了 runit 的最小实现,可用于简单的进程监控需求。首先,为需要的工具创建指向 BusyBox 二进制文件的符号链接

# busybox --list | awk '/^runsv|^chpst$|^sv/' | xargs -I{} ln -sv /usr/bin/busybox /usr/local/bin/{}

之后,可以创建一个 systemd 单元文件,以便在需要时运行 BusyBox 的 runit

/etc/systemd/system/busybox-runit.service
[Unit]
Description=Runit service supervision - BusyBox implementation
Documentation=man:busybox(1) https://smarden.org/runit/

[Service]
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin"
ExecStart=/usr/local/bin/runsvdir -P /var/service
KillSignal=SIGHUP
KillMode=process
Restart=always
SuccessExitStatus=111

[Install]
WantedBy=multi-user.target
${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/busybox-runit.service
[Unit]
Description=Runit service supervision - BusyBox implementation
Documentation=man:busybox(1) https://smarden.org/runit/

[Service]
Environment="HOME=%h" "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin"
ExecStart=/usr/local/bin/runsvdir -P %h/service
KillSignal=SIGHUP
KillMode=process
Restart=always
SuccessExitStatus=111

[Install]
WantedBy=default.target
注意
  • 此示例单元文件预设将要包含已启用服务的目录是系统实例的 /var/service 或用户实例的 $HOME/service。此路径可以根据每个特定用例进行更改。
  • SIGHUP 终止信号用于代替默认的 SIGTERM,并且仅在主 runsvdir 进程上(感谢 KillMode=process),以便由 BusyBox 的 runit 实现控制的进程在终止管理器之前被 runsvdir 可控地停止。当 runsvdir 在收到 SIGHUP 信号后结束正在管理的进程时,它会以状态码 111 退出,这需要解释为成功。

请务必根据创建的 systemd 单元文件创建将由 runsvdir 管理的目录。还建议创建一个可以存储 runit 服务的目录(通常为 /etc/sv),并且仅在需要时通过从被管理的目录创建指向它们的符号链接来启用。有关更多详细信息,请参阅 #通用用法

当一切配置正确后,可以启用和启动 busybox-runit.service

使用标准 runit

可以与默认的 Arch Linux init 系统 (systemd) 一起使用 runit 作为简单的进程管理器。为此,请安装 runit-systemdAUR,它提供了一个精简的 runit 安装,没有任何阶段脚本 (/etc/runit/{1..3}) 或运行级别 (/etc/runit/runsvdir/*),这些通常仅在使用 runit 作为 init 系统时有用。该软件包提供了一个目录 (/var/service),可以在其中放置所需的 runit 服务,以及一个 systemd 单元,用于启动 runit 监控该目录。只有在 /var/service 中配置的服务才会被 runit 管理。只需启用和启动 runit.service

用法

工具

  • sv - 用于控制服务、获取服务状态和依赖项检查。
  • chpst - 控制进程环境,包括内存上限、核心限制、数据段、环境、用户/组权限等等。
  • runsv - 管理进程,并可选择为该进程管理日志服务。
  • svlogd - 一个简单而强大的日志记录器,包括基于不同方法(时间、大小等)的自动轮换、后处理、模式匹配和套接字(远程日志记录)选项。告别 logrotate 以及停止服务以轮换日志的需求。
  • runsvchdir - 更改服务级别(运行级别,见下文)。
  • runsvdir - 启动一个管理树

有关下面未涵盖的用法详情,请参阅手册页。

运行级别和服务目录

Runit 使用符号链接目录来指定运行级别,而不是在 /etc/runit/1、2 和 3 中定义的 3 个主要级别。

1 引导系统,2 在 /service 上启动 runsvdir,3 停止系统。

在运行级别 2 中,您不受任何服务级别数量的限制(相当于 sysvinit 中的运行级别)。您可以 runschdir 到您在 /etc/runit/runsvdir/ 中创建的任何目录(充满了服务目录符号链接)。这在您拥有 HA(故障转移)设置的情况下非常方便,并且您有一台机器可以通过 runsvchdir <服务目录> 来接管许多其他机器的服务。

您还可以通过拥有用户级管理目录来运行依赖服务级别的树。请参阅下面的用户级服务。

默认情况下,runit-run 软件包使用非常小的服务集,在 /etc/runit/runsvdir/archlinux-default 中定义,并符号链接到 /etc/runit/runsvdir/default。

它仅在 tty2 和 tty3 上提供 getty,因此您将启动到仅控制台滚动和一个整洁的 'runsvchdir: default: current'。这意味着当您启动 X 时,它将在 tty4 上。

要返回到标准的 arch 控制台,请删除链接 /service/ngetty 并在 /service 中链接任意数量的 /etc/sv/*getty* 服务,或者编辑 /etc/sv/ngetty/run 文件以获取更多 getty。更好的是,在 /etc/runit/runsvdir 中创建您自己的目录,并为您所需的服务添加所需的符号链接。记住要将您使用 runit 启动的任何服务从 /etc/rc.conf 或 systemctl disable 中的 DAEMONS 中删除,它们不需要在那里启动,并且 runit 将允许并行启动而无需将它们放入后台。

通用用法

在此说明中,/var/service 是选择的由 runsvdir 管理的服务目录,/etc/sv 是选择的用于包含可以启用的服务的目录。

提示: 可以通过设置环境变量 SVDIR 来指示服务目录的路径,从而避免指定服务目录的完整路径。例如,使用 SVDIR=/var/servicesv status /var/service/servicename 变为 sv status servicename
  • 列出正在运行的服务
# sv status /var/service/*
run: /var/service/agetty-2: (pid 4120) 7998s
run: /var/service/agetty-3: (pid 4119) 7998s
run: /var/service/bougyman: (pid 4465) 7972s
run: /var/service/bougyx: (pid 4135) 7998s; run: log: (pid 4127) 7998s
run: /var/service/cron: (pid 4137) 7998s; run: log: (pid 4122) 7998s
run: /var/service/dialer: (pid 4121) 7998s
run: /var/service/qmail: (pid 4138) 7998s; run: log: (pid 4126) 7998s
run: /var/service/smtpd: (pid 4136) 7998s; run: log: (pid 4125) 7998s
run: /var/service/socklog-klog: (pid 4139) 7998s; run: log: (pid 4132) 7998s
run: /var/service/socklog-unix: (pid 4133) 7998s; run: log: (pid 4124) 7998s
run: /var/service/ssh: (pid 4134) 7998s; run: log: (pid 4123) 7998s
  • 创建并启动服务
# ln -s /etc/sv/ssh /var/service/ssh
  • 立即停止服务(下次启动时仍会启动)
# sv down /var/service/ssh
  • 启动先前已停止或配置为不自动启动的服务
# sv up /var/service/ssh
  • 重启服务
# sv restart /var/service/ssh
  • 重载服务
# sv reload /var/service/ssh
  • 显示服务及其日志服务的状态
# sv status /var/service/ssh
  • 停止服务,并禁用它(下次启动时不会启动)
# rm /var/service/ssh

用户服务

创建用户管理树有两种方法:使用 Systemd/User 服务或使用 runit 本身。有关 systemd 用户服务的示例,请参阅 #使用 BusyBox 的实现。要使用 runit 本身,请参阅 Voidlinux 手册中的章节。

示例服务

注意: 此示例假定您的服务存储在 ~/.config/sv 中,并且您的 runsvdir 是 ~/service。您应该将它们更改为您的配置。

创建一个目录,您将在其中保留您的服务。

$ mkdir -p ~/.config/sv

为您的服务创建一个目录。

$ mkdir ~/.config/sv/mpd

创建 服务目录中的 run 文件。您可以在 runit 的站点中找到示例 run 文件

$HOME/.config/sv/mpd/run
#!/bin/sh
MPDCONF=${XDG_CONFIG_HOME:-$HOME/.config}/mpd/mpd.conf
exec mpd --no-daemon $MPDCONF

使其可执行

要启用该服务,请创建一个指向您的服务目录的符号链接。这将使服务在 runit 启动时自动启动。该服务应立即启动。

$ ln -s ~/.config/sv/mpd ~/service/mpd

要停止服务

$ SVDIR=~/service sv down mpd   # or
$ sv down ~/service/mpd

要再次启动服务

$ SVDIR=~/service sv up mpd   # or
$ sv up ~/service/mpd

参见