Что такое systemd? Как создать systemd-сервис?

systemd — менеджер инициализации и сервисов Linux. Он запускает процессы, следит за их состоянием, перезапускает их при сбоях, управляет зависимостями и журналом. Собственный сервис описывают unit-файлом с расширением .service, обычно в /etc/systemd/system.
Подробный ответ

Что такое 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.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге