Введение / Зачем это нужно
Systemd стал стандартом для инициализации и управления службами в большинстве современных дистрибутивов Linux (Ubuntu, Debian, CentOS, Fedora). Понимание управления сервисами — ключевой навык для системного администратора и разработчика, работающего с серверами. После прохождения этого гайда вы сможете уверенно запускать, останавливать, настраивать автозапуск и диагностировать проблемы с любыми сервисами, а также создавать собственные.
Требования / Подготовка
- Доступ к терминалу с правами sudo (или root).
- Дистрибутив Linux, использующий systemd (проверьте командой
systemctl --version). - Базовое понимание командной строки.
Шаг 1: Проверка наличия systemd и список юнитов
Убедимся, что система использует systemd, и посмотрим, какие сервисы (юниты) доступны.
# Проверка версии systemd
systemctl --version
# Показать все загруженные юниты (сервисы, таймеры, сокеты и т.д.)
systemctl list-units --type=service --state=running
# Показать ВСЕ доступные юниты, включая неактивные
systemctl list-unit-files --type=service | head -20
Ключевые статусы юнитов: loaded (файл юнита найден), active (запущен), inactive (остановлен), failed (упал с ошибкой).
Шаг 2: Базовые операции управления состоянием
Здесь основные команды для повседневного контроля.
# Запустить сервис немедленно (не навсегда)
sudo systemctl start nginx
# Остановить сервис
sudo systemctl stop nginx
# Перезапустить (остановить и снова запустить)
sudo systemctl restart nginx
# Перезагрузить (отправить SIGHUP, если сервис поддерживает)
sudo systemctl reload nginx
# Проверить статус (самая информативная команда)
sudo systemctl status nginx
В выводе status смотрите на строку Active: и последние логи в разделе journal. Если статус failed (Result: exit-code), смотрите логи в следующем шаге.
💡 Совет: Для быстрого перезапуска с очисткой состояния используйте
sudo systemctl try-restart nginx— он не запустит сервис, если тот уже остановлен.
Шаг 3: Настройка автозапуска (включение/отключение)
Автозапуск управляется через символические ссылки в каталогах /etc/systemd/system/.
# Включить автозапуск при следующей загрузке системы
sudo systemctl enable nginx
# Создаст ссылку: /etc/systemd/system/multi-user.target.wants/nginx.service -> /lib/systemd/system/nginx.service
# Отключить автозапуск (ссылку удалит, сам файл сервиса останется)
sudo systemctl disable nginx
# Проверить, включён ли сервис в автозагрузку
systemctl is-enabled nginx
# Вывод: enabled, disabled, static, masked
⚠️ Важно: Команда
enableне запускает сервис сразу. Для одноразового запуска используйтеstart, для запуска с включением автозапуска —enable --now.
Шаг 4: Диагностика через journalctl
Логи systemd хранятся в бинарном журнале, доступном через journalctl.
# Показать логи ВСЕХ сервисов в реальном времени (как tail -f)
sudo journalctl -f
# Показать логи КОНКРЕТНОГО сервиса
sudo journalctl -u nginx.service
# Показать логи с момента последней загрузки системы (-b)
sudo journalctl -u nginx.service -b
# Фильтрация по времени (например, за последние 10 минут)
sudo journalctl -u nginx.service --since "10 min ago"
# Показать только сообщения с уровнем ошибка (error, crit, alert, emerg)
sudo journalctl -u nginx.service -p err
# Очистить журнал (осторожно! требует место на диске)
sudo journalctl --vacuum-time=3d # Оставить логи только за последние 3 дня
Для поиска по тексту в логах используйте стандартный grep:
sudo journalctl -u nginx.service | grep -i "permission"
Шаг 5: Создание простого пользовательского сервиса
Допустим, нужно запускать скрипт /opt/myscript.sh при старте системы.
- Создайте файл сервиса
/etc/systemd/system/myscript.service:[Unit] Description=Мой пользовательский скрипт After=network.target [Service] Type=simple ExecStart=/opt/myscript.sh Restart=on-failure RestartSec=10 User=ubuntu Group=ubuntu [Install] WantedBy=multi-user.targetAfter— запускать после сетевого стека.Type=simple— процесс запускается и работает в foreground.Restart=on-failure— перезапускать при падении.User/Group— от какого пользователя запускать.WantedBy— к какому целевому юниту (.target) принадлежит.
- Сохраните файл и выполните:
# Перечитать конфигурацию systemd (обязательно после создания/изменения файлов!) sudo systemctl daemon-reload # Включить и сразу запустить sudo systemctl enable --now myscript.service # Проверить статус sudo systemctl status myscript.service
Проверка результата
- Статус сервиса:
systemctl status <service>должен показыватьactive (running). - Автозапуск:
systemctl is-enabled <service>вернётenabled. - Логи:
journalctl -u <service> -n 20покажет последние 20 строк логов без ошибок. - Функциональность: Если это веб-сервер (nginx/apache), проверьте ответ
curl http://localhost. Если это фоновый процесс — убедитесь, что он работает (ps aux | grep <process>).
Возможные проблемы
| Проблема / Симптом | Вероятная причина | Решение |
|---|---|---|
Failed to start <service>. Unit <service> not found. | Неверное имя сервиса или файл .service отсутствует. | Проверьте точное имя через systemctl list-unit-files | grep <часть_имени>. Убедитесь, что файл лежит в /etc/systemd/system/ или /lib/systemd/system/. |
Permission denied или Access denied при start/stop | Запуск без sudo или отсутствие прав в файле сервиса. | Используйте sudo. Проверьте права на файл сервиса: ls -l /etc/systemd/system/<service>.service. |
Сервис запускается, но сразу падает (active (exited) или failed). | Ошибка в команде ExecStart, отсутствие зависимостей, права на скрипт/бинарник. | Смотрите логи: sudo journalctl -u <service> -b. Проверьте, что скрипт исполняемый (chmod +x) и указан абсолютный путь. |
Failed to execute command: Permission denied (в логах journalctl) | Пользователь, указанный в User=, не имеет прав на доступ к необходимым файлам/портам. | Исправьте права на файлы/каталоги (chown, chmod) или запускайте от root (не рекомендуется). |
Изменения в файле сервиса не применяются после systemctl restart. | Забыли выполнить systemctl daemon-reload после редактирования файла. | Всегда выполняйте sudo systemctl daemon-reload после изменения .service файлов. |
masked статус (сервис заблокирован). | Кто-то выполнил systemctl mask. | Разблокируйте: sudo systemctl unmask <service>, затем sudo systemctl enable <service>. |