Настройка runit в Linux


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



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



Как запустить новый сервис на Linux сервере в 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 привязывается к основному сервису созданием каталога сервиса логирования внутри каталога самого сервиса



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

mcedit /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.



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


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

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

sv d monitor - остановить сервис monitor

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



В современных системах встретить runit довольно сложно, шире используется systemd и suporvisor.

Они выполняют те же задачи, имеют больший функционал и настраиваются проще.

Сказать спасибо