Введение / Зачем это нужно
systemctl — это основная утилита для управления systemd, системы инициализации и менеджера служб, которая используется в подавляющем большинстве современных дистрибутивов Linux (Ubuntu, CentOS, Debian, Fedora и др.). С её помощью вы можете контролировать жизненный цикл фоновых процессов (служб), таких как веб-серверы, базы данных, сетевые демоны и многие другие компоненты системы.
По завершении этого гайда вы будете уверенно управлять службами: запускать, останавливать, настраивать их автозагрузку, перезагружать конфигурацию и диагностировать неполадки. Эти навыки являются обязательной базой для любого системного администратора и разработчика, работающего с серверами.
Требования / Подготовка
- Доступ к терминалу Linux с установленным
systemd. Вы можете проверить его наличие командой:
Команда должна вернутьps -p 1 -o comm=systemd. - Права суперпользователя (root или sudo) для управления большинством системных служб. Для управления пользовательскими службами права root могут не потребоваться.
- Базовое понимание командной строки и структуры имён служб (обычно они имеют расширение
.service, например,nginx.serviceилиsshd.service).
Шаг 1: Проверка статуса службы
Перед любым действием полезно узнать текущее состояние службы.
sudo systemctl status <имя_службы>.service
- Пример:
sudo systemctl status nginx.service - Что делает: Выводит подробную информацию: активно ли юнит, был ли он успешно запущен, PID процесса, время последнего запуска и последние строки журнала этой службы.
- Короткая форма: Для простого вывода статуса (активен/неактивен) используйте
systemctl is-active <имя_службы>илиsystemctl is-enabled <имя_службы>(показывает, включена ли автозагрузка).
Шаг 2: Базовое управление (запуск, остановка)
Эти команды управляют службой в текущей сессии, без сохранения состояния после перезагрузки.
# Запустить службу немедленно
sudo systemctl start <имя_службы>.service
# Остановить службу
sudo systemctl stop <имя_службы>.service
- Пример:
sudo systemctl start apache2.service - Важно: Если служба уже запущена, команда
startничего не сделает. Если остановлена —stopтакже ничего не изменит. Для принудительного перезапуска см. следующий шаг.
Шаг 3: Настройка автозагрузки (enable/disable)
Чтобы служба запускалась автоматически при каждой загрузке системы, необходимо её "включить".
# Включить автозапуск службы при загрузке
sudo systemctl enable <имя_службы>.service
# Отключить автозапуск
sudo systemctl disable <имя_службы>.service
- Что происходит:
enableсоздаёт символические ссылки в каталоге/etc/systemd/system/(или/lib/systemd/system/), указывающие systemd на необходимость запуска этой службы при достижении определённого целевого уровня (target), обычноmulti-user.targetилиgraphical.target. - Полезная команда:
systemctl is-enabled <имя_службы>.serviceпокажет, настроена ли автозагрузка (enabled/disabled/static/masked).
Шаг 4: Перезапуск и перезагрузка конфигурации
Часто после изменения конфигурационного файла службы (например, /etc/nginx/nginx.conf) нужно применить изменения без полной остановки.
# Полный перезапуск (остановить и снова запустить)
sudo systemctl restart <имя_службы>.service
# Перезагрузить конфигурацию (без остановки, если служба это поддерживает)
sudo systemctl reload <имя_службы>.service
- Критическое отличие:
restartгарантирует, что служба запустится заново с чистой средой, но вызывает кратковременный простой.reload— это более "мягкая" операция, но не все службы её поддерживают. Еслиreloadнедоступен, systemd сообщит об этом. - Альтернатива:
sudo systemctl try-reload-or-restart <имя_службы>.serviceпопробует выполнитьreload, а если нет —restart.
Шаг 5: Просмотр журналов (логов) службы
Диагностика начинается с логов. journalctl — это инструмент для работы с журналом systemd (journal).
# Показать все логи для конкретной службы
sudo journalctl -u <имя_службы>.service
# Показать логи с текущей загрузки системы (после последнего reboot)
sudo journalctl -u <имя_службы>.service -b
# Следить за логами в реальном времени (аналог tail -f)
sudo journalctl -u <имя_службы>.service -f
- Фильтры: Добавьте
--since "2024-01-01 10:00:00"для фильтрации по времени или-p errдля показа только сообщений об ошибках. - Полезно: Комбинация
systemctl statusиjournalctlпозволяет быстро понять, почему служба не запускается или ведёт себя нестабильно.
Шаг 6: Дополнительные полезные операции
Перезагрузка всей системы (Isolate Target)
Переключение systemd на другой целевой уровень (target), аналогично изменению runlevel в SysVinit.
# Переключиться в многопользовательский режим без графики (аналог runlevel 3)
sudo systemctl isolate multi-user.target
# Вернуться в графический режим (аналог runlevel 5)
sudo systemctl isolate graphical.target
Блокировка службы (Mask/Unmask)
Экстремальная мера, которая предотвращает любой запуск службы, даже вручную или как зависимость.
# Полностью заблокировать службу (создаёт символическую ссылку на /dev/null)
sudo systemctl mask <имя_службы>.service
# Разблокировать
sudo systemctl unmask <имя_службы>.service
- Внимание: Используйте
maskс осторожностью. Заблокировать можно критически важную службу (например,sshd), после чего может потребоваться доступ к консоли управления для разблокировки.
Перезагрузка демона (Daemon-Reload)
После изменения файла юнита (самого .service файла, например, в /etc/systemd/system/), нужно сообщить systemd об этом.
sudo systemctl daemon-reload
- Когда: Всегда после ручного редактирования или создания нового файла службы, но перед её перезапуском (
restart).
Проверка результата
- Проверьте статус:
sudo systemctl status <имя_службы>.service. Убедитесь, что строкаActive:показываетactive (running)для запущенных служб илиinactive (dead)для остановленных. - Проверьте автозагрузку:
systemctl is-enabled <имя_службы>.serviceдолжен вернутьenabled. - Протестируйте функциональность: Для веб-сервера — сделайте HTTP-запрос (
curl http://localhost), для SSH — попробуйте подключиться. Это самый надёжный способ убедиться, что служба работает корректно, а не просто "запущена".
Возможные проблемы
| Проблема / Симптом | Вероятная причина | Решение |
|---|---|---|
Failed to start <служба>.service | Ошибка в конфигурационном файле службы или зависимостях. | 1. Выполните sudo systemctl status <служба>.service и найдите строку Result:. 2. Просмотрите логи: sudo journalctl -u <служба>.service -b -p err. 3. Проверьте синтаксис конфигурации (если есть утилита -t, например, nginx -t). |
Unit <служба>.service not found. | Служба не установлена, имя указано неверно или файл юнита отсутствует. | 1. Убедитесь в правильности имени. 2. Найдите файл: sudo find / -name "*<часть_имени>*.service" 2>/dev/null. 3. Если служба не установлена — установите соответствующий пакет (e.g., sudo apt install nginx). |
Permission denied при start/stop | Запуск без прав суперпользователя (sudo). | Все операции управления системными службами требуют sudo. Используйте sudo systemctl ... или войдите в сессию root. |
| Служба запускается, но не работает (порт не слушает, процесс не отвечает) | Проблема внутри самой службы (ошибка в коде, нехватка ресурсов, конфликт портов). | 1. Проверьте, запущен ли процесс: ps aux | grep <имя_процесса>. 2. Проверьте, слушает ли нужный порт: sudo ss -tulpn | grep :<порт>. 3. Изучите логи приложения (не только journald) в /var/log/ или указанных в конфиге. |
masked служба не запускается, даже после enable | Служба была заблокирована (mask). | Разблокируйте её: sudo systemctl unmask <служба>.service, затем sudo systemctl enable --now <служба>.service. |