#рабочийкейс
Недавно тут переводил приложение с uWSGI веб сервера на Gunicorn и надо было отделить от одного основного процесса с самим сервером все celery воркеры, rsync, sshd на отдельные сервисы.
Ну и помощник в этом конечно же systemd, который прокинет и разрешит все зависимости между ними 👍
Пример простого сервиса, который будет перманентно крутить ваше приложение и перезапускать, если будут ошибки:
1. Создаем файл с сервисом
my_server.service:Description=my service
Wants=postgresql.service another.service
After=syslog.target postgresql.service
[Service]
EnvironmentFile=/etc/environment
User=my_user
Group=my_user
ExecStart=/opt/my_script.sh --some_flag /some/path/program.py --daemon
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Description - название сервиса, будет видно в списке работающих и зарегистрированных сервисов на машинеWants - то, что требуется вашему сервису, чтобы работало вместе с ним. Это мягкая зависимость, есть более жесткая, типа Requires, которая не даст запуститься вашему сервису, если сервис, от которого он зависит не работаетAfter - после чего ваш сервис должен запуститься. Везде, где указываем названия сервисов перечисление идет через пробелRestart - сценарий рестарта сервиса, в данном случае, если ошибка программыRestartSec - сколько ждать перед перезапускомОстальное должно быть логически понятно и основное же это запуск самой вашей программы -
ExecStart. Тут мы пишем команду для запуска 😎Директив у systemd для гибкой настройки еще много, найти не проблема, основные же выше)
А вот например зависимый от нашего сервера другой сервис
another.service:[Unit]
Description=another some service
After=my_server.service
PartOf=my_server.service
PropagatesReloadFrom=my_server.service
[Service]
EnvironmentFile=/etc/environment
User=my_user
Group=my_user
ExecStart=/opt/some_code.sh
[Install]
WantedBy=multi-user.target
Запускается только после нашего основного сервиса, является его составной частью и перезапускается вместе с ним
2. Кидаем эти файлы *.service в
/usr/lib/systemd/system/3.
systemctl daemon-reload перезагружаем все сервисы в systemd4.
systemctl enable my_server.service и systemctl enable another.service включаем наши сервисы5.
systemctl restart my_server.service и systemctl restart another.service запускаем наши сервисыТеперь наша программа будет запускаться вместе с ОС (linux like), перезапускаться на ошибках и зависеть в правильном порядке между своими процессами 😍
