Установка

runit — это система инициализации со встроенными средствами контроля за процессами.

Установка в Ubuntu:

sudo apt-get install runit runit-systemd

Запуск сервисов от непривилегированного пользователя

Чтобы разрешить непривилегированному пользователю user управлять собственной конфигурацией для runit, нужно с правами суперпользователя выполнить:

mkdir -p /etc/service/run-user/supervise
cat > /etc/service/run-user/run << EOF
#!/bin/sh

exec 2>&1
exec chpst -u user runsvdir /home/user/sv
EOF
chmod +x /etc/service/run-user/run

В результате в каталоге /home/user/sv пользователь user сможет создавать собственные правила управления сервисами.

Пример сервиса

Для запуска сервера Redis пользователем user нужно создать файл конфигурации /home/user/redis/etc/redis.conf:

daemonize no
port 5079
tcp-backlog 128
timeout 0
tcp-keepalive 60
loglevel warning
databases 1
save 300 10
dir /home/user/redis/var
dbfilename surok.rdb
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 4mb 1mb 60
client-output-buffer-limit pubsub 4mb 1mb 60
maxclients 50

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

Скрипт /home/user/sv/redis/run, который runit использует для запуска процесса:

#!/bin/sh -e

WORKDIR=/home/user/redis

cd "${WORKDIR}" || exit 1
exec 2>&1
exec redis-server etc/redis.conf

Журналирование выполняется с помощью входящей в состав пакета runit программы svlogd. Скрипт для его запуска должен находиться в подкаталоге log (/home/user/sv/redis/log/run):

#!/bin/sh -e

LOGDIR=/home/user/redis/log

mkdir -p "${LOGDIR}"
exec svlogd -tt "${LOGDIR}""