Runit 应用于 Ruby 程序的开发
Runit 是一个进程监管程序,附带了一系列监管有关的工具集。它可以作为 sysvinit 的替代品,也可以和 init 并行运行维护监管程序层级。
- 可以通过
sv s /service/*
($SVDIR) 查看所有的服务,以及其日志。 /service/*
的服务被链接到/etc/sv/
目录,服务只需含有一个 run 文件即可。- run 可执行文件应该将程序 exec 到前台,stderr 转到 stdout:
exec 2>&1; exec yourapp
. 这也是 Runit 对你的应用程序的唯一要求:前台,日志 - Runit 将各种功能封装进 c 写的小工具集里面。
/etc/sv/xxx/log/
被视作日志服务,可以在/etc/sv/xxx/logrun
中写exec svlogd -t /var/log/xxx/
。- svlogd 是轻量的日志系统。在不停下来应用程序的情况下,它可以按照 metrics 做 rotation,后续处理,网络日志,通知,过滤等等。
- Runit 的日志配置不算直白,但是都用文档写清楚了。
- 程序崩溃,runsv 会立即重启,不需干预。程序启动马上失败,runsv 会等待一秒再启动,避免过度消耗资源。如果服务目录内提供了 finish,这调用这个 finish 脚本,调用参数是 exit code 和 run 的 exit status。
- 可以通过
sv s xxx
查看服务状态,sv t xxx
发送 TERM,sv d xxx
关闭(down)。 - 移除链接 /service,相当于发送了 d(own) 给 runsv,停止进程和日志, 关闭 runsv。
- 服务依赖:可以在 run 脚本中写
sv -w7 check asvc bsvc csvc
,这样默认等 7 秒才执行后续的 exec 部分。整个服务必须等到依赖的服务都起好了才会起好。 - sv 允许提供用户级别的 supervision, 服务目录可设在 /home/$user/service 内。
- run 中使用 chpst 设定干净的进程状态。可以在 /proc/PID/env/ 中查看进程的环境变量。