Что такое systemd
systemd управляет системными сервисами и процессами в современных Linux-дистрибутивах. Через него можно запускать, останавливать, перезапускать сервисы, включать автозапуск, смотреть статус и логи.
Структура unit-файла
Для собственного приложения создают unit-файл, например /etc/systemd/system/my-app.service. Обычно он содержит разделы [Unit], [Service] и [Install].
[Unit]
Description=My Python application
After=network.target
[Service]
Type=simple
User=deploy
Group=www-data
WorkingDirectory=/srv/my-app
EnvironmentFile=/etc/my-app/my-app.env
ExecStart=/srv/my-app/.venv/bin/gunicorn config.wsgi:application --bind 127.0.0.1:8000 --workers 3
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Важное правило для virtualenv
В systemd не нужно выполнять source .venv/bin/activate. Надёжнее указать полный путь к исполняемому файлу из виртуального окружения прямо в ExecStart.
Загрузка и запуск сервиса
sudo systemctl daemon-reload
sudo systemctl enable my-app
sudo systemctl start my-app
sudo systemctl status my-app
Управление сервисом
sudo systemctl restart my-app
sudo systemctl stop my-app
sudo systemctl disable my-app
journalctl -u my-app -f
Полезные настройки Service
User и Group — пользователь и группа, от имени которых работает приложение;
WorkingDirectory — рабочая директория процесса;
EnvironmentFile — файл с переменными окружения;
Restart — политика перезапуска при ошибке;
After и Wants — порядок запуска и зависимости от других unit.
Как ответить на собеседовании
Systemd — менеджер сервисов Linux. Для своего приложения я создаю .service-unit в /etc/systemd/system, указываю пользователя, рабочую директорию, environment file и полный путь к executable из virtualenv. После изменения выполняю systemctl daemon-reload, затем включаю и запускаю сервис через systemctl.