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-файлов, разницаenablevsstart, и умение читатьsystemctl status. Частая ошибка — забытьdaemon-reloadпосле изменения unit-файла, из-за чего systemd использует старую конфигурацию.