2019-06-01 21:08:41 +00:00
|
|
|
|
= runit: система инициализации
|
2019-06-02 23:26:28 +00:00
|
|
|
|
:title-separator: {sp}|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
:category: Linux
|
|
|
|
|
:tags: Debian, Ubuntu, Linux, инициализация, runit,
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
== Установка
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
http://smarden.org/runit/[runit] — это система инициализации со
|
2019-04-20 20:24:14 +00:00
|
|
|
|
встроенными средствами контроля за процессами.
|
|
|
|
|
|
|
|
|
|
Установка в Ubuntu:
|
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[source,sh]
|
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
sudo apt-get install runit runit-systemd
|
2019-06-01 21:08:41 +00:00
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
== Запуск сервисов от непривилегированного пользователя
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
|
|
|
|
Чтобы разрешить непривилегированному пользователю `user` управлять
|
|
|
|
|
собственной конфигурацией для runit, нужно с правами суперпользователя
|
|
|
|
|
выполнить:
|
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[source,sh]
|
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
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
|
2019-06-01 21:08:41 +00:00
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
|
|
|
|
В результате в каталоге `/home/user/sv` пользователь `user` сможет
|
|
|
|
|
создавать собственные правила управления сервисами.
|
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
== Пример сервиса
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
|
|
|
|
Для запуска сервера Redis пользователем `user` нужно создать файл
|
|
|
|
|
конфигурации `/home/user/redis/etc/redis.conf`:
|
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[source,text]
|
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
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
|
2019-06-01 21:08:41 +00:00
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
Запускаемый сервер должен запускаться не в фоновом режиме, чтобы `runit`
|
|
|
|
|
мог контролировать его состояние.
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
Скрипт `/home/user/sv/redis/run`, который `runit` использует для запуска
|
|
|
|
|
процесса:
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[source,sh]
|
|
|
|
|
----
|
|
|
|
|
#!/bin/sh -e
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
|
|
|
|
WORKDIR=/home/user/redis
|
|
|
|
|
|
|
|
|
|
cd "${WORKDIR}" || exit 1
|
|
|
|
|
exec 2>&1
|
|
|
|
|
exec redis-server etc/redis.conf
|
2019-06-01 21:08:41 +00:00
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
Журналирование выполняется с помощью входящей в состав пакета runit
|
|
|
|
|
программы `svlogd`. Скрипт для его запуска должен находиться в
|
|
|
|
|
подкаталоге `log` (`/home/user/sv/redis/log/run`):
|
2019-04-20 20:24:14 +00:00
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[source,sh]
|
|
|
|
|
----
|
2019-04-20 20:24:14 +00:00
|
|
|
|
#!/bin/sh -e
|
|
|
|
|
|
|
|
|
|
LOGDIR=/home/user/redis/log
|
|
|
|
|
|
|
|
|
|
mkdir -p "${LOGDIR}"
|
|
|
|
|
exec svlogd -tt "${LOGDIR}""
|
2019-06-01 21:08:41 +00:00
|
|
|
|
----
|
|
|
|
|
|