Gymterview
middle

Как работает systemd? Основные команды systemctl и unit-файлы.

systemd — система инициализации и управления сервисами в Ubuntu 24.04. Основной инструмент управления — systemctl.

Основные команды systemctl

Пример
# Управление сервисами
sudo systemctl start nginx       # Запустить
sudo systemctl stop nginx        # Остановить
sudo systemctl restart nginx     # Перезапустить
sudo systemctl reload nginx      # Перечитать конфигурацию (без перезапуска)
sudo systemctl status nginx      # Показать статус

# Автозапуск при загрузке
sudo systemctl enable nginx      # Включить автозапуск
sudo systemctl disable nginx     # Отключить автозапуск
sudo systemctl enable --now nginx # Включить автозапуск и сразу запустить

# Информация
systemctl list-units --type=service              # Все активные сервисы
systemctl list-unit-files --type=service          # Все установленные сервисы
systemctl is-active nginx                          # Проверить, запущен ли
systemctl is-enabled nginx                         # Проверить автозапуск

# Перезагрузка конфигурации systemd (после изменения unit-файлов)
sudo systemctl daemon-reload

Unit-файлы

Конфигурационные файлы systemd. Расположение:

  • /lib/systemd/system/ — unit-файлы из пакетов (не редактировать)
  • /etc/systemd/system/ — пользовательские unit-файлы и переопределения (приоритетнее)

Структура unit-файла

Пример unit-файла для Java-приложения
[Unit]
Description=My Java Application
Documentation=https://example.com/docs
After=network.target postgresql.service
Requires=postgresql.service

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/application.jar
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

# Ограничение ресурсов
MemoryMax=512M
CPUQuota=80%

# Переменные окружения
Environment=SPRING_PROFILES_ACTIVE=production
EnvironmentFile=/opt/myapp/.env

[Install]
WantedBy=multi-user.target

Секции unit-файла

Секция Описание
[Unit] Описание, зависимости, порядок запуска. After — запуск после указанного юнита. Requires — обязательная зависимость. Wants — необязательная.
[Service] Параметры сервиса: тип, пользователь, команды запуска/остановки, политика перезапуска.
[Install] Определяет, в какой target включается сервис при systemctl enable. multi-user.target — многопользовательский режим без графики.

Типы сервисов (Type)

  • simple — основной процесс запускается напрямую (по умолчанию)
  • forking — процесс создаёт дочерний процесс и завершается (классические демоны)
  • oneshot — выполняет задачу и завершается
  • notify — как simple, но сервис уведомляет systemd о готовности

journalctl — просмотр логов systemd

Пример
journalctl -u nginx              # Логи конкретного сервиса
journalctl -u nginx -n 100       # Последние 100 строк
journalctl -u nginx -f           # Следить в реальном времени (аналог tail -f)
journalctl --since "2024-04-01"  # Логи за период
journalctl -p err                # Только ошибки и критические

На собеседовании: ключевые моменты — daemon-reload после изменения unit-файлов, разница enable vs start, и умение читать systemctl status. Частая ошибка — забыть daemon-reload после изменения unit-файла, из-за чего systemd использует старую конфигурацию.