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/ 中查看进程的环境变量。