Запуск сервиса под пользователем

Материал из Etersoft wiki
Перейти к: навигация, поиск

Проблема

Когда мы хотим запустить сервис, собранный в пакет, всё просто: ставим пакет, выполняем service something start и готово. Но тут всё просто только потому. что мантейнер пакета написал сложный init-скрипт, учитывающий все нюансы запуска, либо уже используется systemd, для которого составлен service-файл (выглядящий просто и многое учитывающий).

Если мы запускаем нечто не собранное (а только вынутое из репозитория, например), задача сильно усложняется.

Вот например как я организовал запуск сервиса odoo:

# cat /etc/rc.d/rc.local 
#!/bin/sh
su - -c "/home/lav/odoo/odoo.sh" lav &


# cat /home/lav/odoo/odoo.sh
#!/bin/sh
cd $(dirname $0)
./odoo.py -c openerp-server.conf

И тут мы ничего не знаем о мониторинге, PID-файле и перезапуске.

Описание работы systemd

В принципе, .service файл для systemd выглядел бы примерно так (не проверялось):

[Service]
Type=simple
PIDFile=/var/run/odoo.pid
User=lav
WorkingDirectory=/home/lav/odoo/
ExecStart=/home/lav/odoo/odoo.py
Restart=always

и это вполне работающее решение.

При этом systemd умеет следить за процессом и перезапускать его в случае падения.

Решение

systemV + monit

Если не переходить на systemd, предлагается для запуска под пользователем сделать специальный скрипт, который будет брать файлы упрощённого формата systemd из каталога /etc/systemd-lite/, запускать сервисы, генерировать файлы для monit и включать мониторинг.

Наша реализация anyservice для sysvinit

http://wiki.etersoft.ru/Anyservice

Другие решения, не связанные с /sbin/init