Настройка runit в Linux предполагает написание исполняемого скрипта с именем run в /etc/sv/ и создание с него символьной ссылки в каталог /etc/service
Единственное условие для использования runit — процесс не должен демонизироваться. Т.е. открепляться от породившего его родительского процесса.
Как запустить новый сервис на Linux сервере в runit:
- Создать каталог под скрипты в /etc/sv/
- Добавить скрипт run и сделать его исполняемым
- Создать символьную ссылку в /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.
Они выполняют те же задачи, имеют больший функционал и настраиваются проще.