89 lines
2.5 KiB
Markdown
89 lines
2.5 KiB
Markdown
---
|
||
title: "runit: система инициализации"
|
||
category: Linux
|
||
tags: Debian, Ubuntu, Linux, инициализация, runit,
|
||
summary:
|
||
...
|
||
|
||
### Установка
|
||
|
||
[runit](http://smarden.org/runit/) — это система инициализации со
|
||
встроенными средствами контроля за процессами.
|
||
|
||
Установка в Ubuntu:
|
||
|
||
```sh
|
||
sudo apt-get install runit runit-systemd
|
||
```
|
||
|
||
### Запуск сервисов от непривилегированного пользователя
|
||
|
||
Чтобы разрешить непривилегированному пользователю `user` управлять
|
||
собственной конфигурацией для runit, нужно с правами суперпользователя
|
||
выполнить:
|
||
|
||
```sh
|
||
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` использует для
|
||
запуска процесса:
|
||
|
||
```sh
|
||
#!/bin/sh
|
||
|
||
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`):
|
||
|
||
```sh
|
||
#!/bin/sh -e
|
||
|
||
LOGDIR=/home/user/redis/log
|
||
|
||
mkdir -p "${LOGDIR}"
|
||
exec svlogd -tt "${LOGDIR}""
|
||
```
|