Настройка runit

Настройка runit предполагает написание исполняемого скрипта с именем run в /etc/sv/ и создание с него символьной ссылки в каталог /etc/service

 

Настройка runit

Единственное условие для использования runit — процесс не должен демонизирвоаться. Т.е. открепляться от породившего его родительского процесса.

 

Как завести новый сервис под runit:

  1. Создать каталог под скрипты в /etc/sv/
  2. Добавить скрипт run и сделать его исполняемым
  3. Создать символьную  ссылку в /etc/service

 

Например, создадим скрипт для собстенной программы, называемой monitor

mkdir /etc/sv/monitor

В каталоге создаем скрипт с именем run.

mcedit /etc/sv/monitor/run

#!/bin/sh
exec 2>&1
exec chpst -umonitor \
«$(monitor —exec-path)»/monitor —verbose —reuseaddr \
—base-path=/var/cache /var/cache/monitor

 

chmod 0755 /etc/sv/monitor/run

Симлинк позволит автоматически стартовать сервис при перезагрузке

ln -s /etc/sv/monitor /etc/service

 

Сервис автоматически запустится, процесс можно увидеть при помощи ps

ps uax | grep monitor

root 6236 0.0 0.0 164 4 ? Ss 19:03 0:00 runsv monitor
119 12093 0.0 0.0 11460 812 ? S 23:46 0:00 /usr/lib/monitor —verbose —reuseaddr —base-path=/var/cache /var/cache/monitor

 

Документация по runit

 

 

Логи runit

Сервис логирования в runit привязывается к основному сервису созданием каталога сервиса логирования внутри каталога самого сервиса

mcedit /etc/sv/monitor/log/run

 

Скрипт запуска логирующего сервиса (/etc/sv/monitor/log/run):

#!/bin/sh
exec chpst -u monitor svlogd -tt /var/log/monitor

 

 

После добавления созданного сервиса в супервизор (ln -s /etc/sv/monitor /etc/services) runit автоматически запустит сервис monitor, соответствующий ему сервис monitor/log и перенаправит stdout первого на stdin второго.

 

 

Чтобы сделать сервис зависимым от другого нужно убедить в том, что другой запускается раньше

 

Пример из документации. Условием для cron задается socklog.

cat /etc/sv/cron/run

#!/bin/sh
sv start socklog-unix || exit 1
exec cron -f

 

Запуск службы не от root

Запуск репривелегированным пользователем возможен, достаточно выдать нужные права на ./supervise

chmod 755 ./supervise

chown user ./supervise/ok ./supervise/control ./supervise/status

Аналогично можно сделать для группы пользователей.

 

 

Встречающийся чаще всего runit скрипт — для Nginx

Скрипт запуска сервиса (/etc/sv/nginx/run):

 

#!/bin/sh
exec 2>&1
exec /usr/sbin/nginx -g 'daemon off;'

 

Здесь задается перенаправление stderr в stdout – по-умолчанию, лог будет брать данные из stdin.

 

Управление сервисом выполняется несколькими командами:

sv s monitor — просмотреть статус службы monitor

sv t monitor — перезапустить monitor

sv d monitor — остановить monitor

sv u monitor — стартовать monitor