Запуск сервиса под пользователем
Проблема
Когда мы хотим запустить сервис, собранный в пакет, всё просто: ставим пакет, выполняем 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
- Supervisor: A Process Control System
- Описание supervisor на русском
- Описание systemd.service
- Проект с таким же названием и целью для win Описание код