NPV-AM

Опубликовано: 20 июля 2026
Linux Systemd

Systemd: от сервиса до таймера

Systemd — стандартный init-систем в modern Linux дистрибутивах. Он управляет сервисами, таймерами, сокетами и многим другим через единую систему юнитов. Понимание systemd критично для любого DevOps-инженера.

Типы юнитов

Systemd работает с различными типами юнитов, каждый из которых решает свою задачу:

Создание сервиса

# /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 предоставляет несколько типов зависимостей:

# Пример сложных зависимостей
[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 сделает вашу инфраструктуру более надёжной и удобной в сопровождении.

← Назад к списку статей