02 · Инженерия и архитектура2.1 · Linux и инфраструктура2.1.3лёгкий

systemd: сервис под управлением ОС

Зачем это нужно

Запустить inference-сервис командой python app.py в терминале — нормально для разработки. В продакшене терминал закроется, SSH оборвётся, сервер перезагрузится — и сервис умрёт. systemd — менеджер служб в большинстве современных Linux-дистрибутивов. Он стартует сервис при загрузке, перезапускает при падении, собирает логи в journal.

Понимание systemd нужно MLE хотя бы на уровне: прочитать unit-файл, перезапустить сервис, посмотреть статус. На Kubernetes логика похожая (Deployment, liveness probe), но systemd — фундамент.

Основные идеи

Unit-файл — конфигурация службы. Располагается в /etc/systemd/system/scoring.service:

` [Unit] Description=ML Scoring Inference Service After=network.target postgresql.service Requires=network.target

[Service] Type=simple User=mlservice WorkingDirectory=/opt/scoring-service Environment=MODEL_PATH=/opt/models/fraud_v2.pkl Environment=LOG_LEVEL=info ExecStart=/opt/scoring-service/venv/bin/gunicorn app:app -b 0.0.0.0:8080 Restart=on-failure RestartSec=5

[Install] WantedBy=multi-user.target `

Ключевые директивы:

  • After / Requires — зависимости (сеть, БД).

  • User — не запускать от root.

  • Environment — переменные окружения.

  • ExecStart — команда запуска.

  • Restart=on-failure — автоперезапуск при ненулевом exit code.

Управление сервисом:

sudo systemctl daemon-reload # после изменения unit-файла sudo systemctl enable scoring.service # автозапуск при boot sudo systemctl start scoring.service sudo systemctl status scoring.service sudo systemctl restart scoring.service sudo systemctl stop scoring.service

Healthcheck — проверка, что сервис действительно готов. systemd умеет:

[Service] ExecStart=/opt/scoring-service/venv/bin/gunicorn app:app -b 0.0.0.0:8080 ExecStartPost=/opt/scoring-service/scripts/wait-for-health.sh

Скрипт wait-for-health.sh крутит curl на /health до успеха. В Kubernetes аналог — readinessProbe.

Отдельно приложение должно иметь endpoint /health, возвращающий 200, когда модель загружена.

SSH — способ удалённого доступа к серверу:

ssh user@hostname ssh -i ~/.ssh/id_ed25519 deploy@ml-prod-01

Ключи в ~/.ssh/, пароли в продакшене часто отключены. После входа — systemctl status, journalctl, деплой новой версии.

Как это выглядит на практике

Деплой новой модели fraud_v3.pkl:

  1. MLE копирует артефакт на сервер (scp или CI/CD pipeline).

  2. Обновляет Environment=MODEL_PATH=... или symlink current → fraud_v3.pkl.

  3. sudo systemctl restart scoring.service

  4. curl http://localhost:8080/health{"status": "ok", "model_version": "fraud_v3"}

  5. Запись в Confluence runbook: «rollback = symlink на fraud_v2 + restart».

Если сервис падает при старте (битый pickle), Restart=on-failure создаст loop — systemctl status покажет activating (auto-restart), в journalctl — traceback Python.

Что сделать после занятия

  • Напишите unit-файл для учебного Flask/FastAPI приложения.

  • Добавьте endpoint /health в своё приложение.

  • Потренируйтесь: start → status → restart → journalctl (на VM или WSL).

Официальные материалы