Systemd: от сервиса до таймера
Systemd — стандартный init-систем в modern Linux дистрибутивах. Он управляет сервисами, таймерами, сокетами и многим другим через единую систему юнитов. Понимание systemd критично для любого DevOps-инженера.
Типы юнитов
Systemd работает с различными типами юнитов, каждый из которых решает свою задачу:
.service— управление демоном или процессом.timer— планирование выполнения (аналог cron).socket— управление сокетами для socket activation.path— мониторинг изменений в файловой системе.mount/.automount— управление монтированием
Создание сервиса
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
Requires=postgresql.service
Wants=redis.service
[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/server --config /etc/myapp/config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5
Environment=RUST_LOG=info
Environment=DATABASE_URL=postgres://localhost/myapp
# Ограничения ресурсов
MemoryMax=512M
CPUQuota=80%
LimitNOFILE=65536
# Безопасность
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/myapp /var/log/myapp
[Install]
WantedBy=multi-user.target
Таймеры вместо cron
Systemd-таймеры — современная замена cron. Они offering преимущества: логирование, зависимости, точное время выполнения.
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup timer
[Timer]
OnCalendar=*-*-* 02:30:00
RandomizedDelaySec=30min
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=Daily backup
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
Активация таймера:
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers --all
Зависимости между сервисами
Systemd предоставляет несколько типов зависимостей:
Requires— критическая зависимость (если dependent падает, dependent тоже)Wants— мягкая зависимость (запускает, но не останавливает при падении)After— порядок запуска (не создаёт зависимость, только порядок)Before— обратный порядок запуска
# Пример сложных зависимостей
[Unit]
Description=Web Application
After=network.target postgresql.service redis.service
Requires=postgresql.service
Wants=redis.service memcached.service
ИспользуйтеRequiresтолько для критических зависимостей. Для опциональных сервисов используйтеWants— приложение должно уметь работать без них.
Логирование
Systemd использует journald для сбора логов. Просмотр логов конкретного сервиса:
# Просмотр логов сервиса
journalctl -u myapp.service
# Логи с фильтрацией
journalctl -u myapp --since "1 hour ago"
journalctl -u myapp --since today --no-pager
# Логи в реальном времени
journalctl -fu myapp
# Сохранение логов на диск
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
Watchdog
Systemd может автоматически перезапускать сервис, если он завис. Для этого приложение должно периодически отправлять sd_notify сигнал:
[Service]
Type=notify
WatchdogSec=30
Restart=on-watchdog
Приложение должно вызывать sd_notify(0, "WATCHDOG=1") не реже чем раз в 30 секунд. Если сигнал не получен — сервис перезапускается.
Полезные команды
# Статус сервиса
systemctl status myapp
# Управление
systemctl start myapp
systemctl stop myapp
systemctl restart myapp
systemctl reload myapp
# Автозапуск
systemctl enable myapp
systemctl disable myapp
# Просмотр зависимостей
systemctl list-dependencies myapp
# Проверка конфигурации
systemd-analyze verify /etc/systemd/system/myapp.service
Заключение
Systemd — мощная система управления, которая заменяет cron, init-скрипты и many other инструменты. Освоение юнитов, таймеров и watchdog сделает вашу инфраструктуру более надёжной и удобной в сопровождении.