2.1.3 · блок 2
systemd: сервис под управлением ОС
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).