Skip to main content

systemctl — справочник

Systemctl — утилита для управления systemd — системой инициализации и менеджером служб в Linux. Она отвечает за запуск и контроль демонов, таймеров, точек монтирования и других компонентов, описываемых unit-файлами.

Кратко

systemd управляет набором объектов: сервисами, сокетами, таймерами, монтированиями и т.д. Каждый объект описывается unit-файлом; systemctl — основной интерфейс для взаимодействия с этими unit'ами и с самой системой.

Что такое unit-файл?

Unit-файл — это конфигурационный файл, который описывает, как именно systemd должен управлять конкретным компонентом (сервисом, сокетом, таймером и т.д.). Обычно имеют расширение .service, .socket, .timer, .mount, .target и т.д.

Где хранятся:

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

Пример простого unit-файла (nginx.service):


Description=A high performance web server
After=network.target
[Service]
ExecStart=/usr/sbin/nginx -g 'daemon off;'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target 

Пояснение полей:

  • [Unit] — метаинформация и зависимости (например, After=).
  • [Service] — команды запуска/остановки, поведение при сбое (Restart), пользователь и окружение.
  • [Install] — как unit включается в target'ы (автозапуск).

Базовое управление

Проверка статуса сервиса

Команда показывает состояние (active/failed), PID, путь к unit-файлу и последние строки логов:

sudo systemctl status nginx
Запуск / Остановка / Перезапуск

Запуск вручную (не влияет на автозапуск при следующей загрузке):

sudo systemctl start nginx

Остановка:

sudo systemctl stop nginx

Перезапуск (полностью остановит, затем запустит):

sudo systemctl restart nginx

Перезапустить только если сервис уже запущен:

sudo systemctl try-restart nginx

Когда использовать: перезапуск обязателен при изменении конфигурации демона, но перед этим убедитесь, что unit-файл и конфигурация корректны.

Автозагрузка сервисов

enable / disable

enable создаёт символьные ссылки unit'а в каталогах target'ов — сервис запустится при загрузке системы. disable убирает эти ссылки, но не мешает ручному запуску.

sudo systemctl enable nginx
sudo systemctl disable nginx
systemctl is-enabled nginx

Важно: enable не запускает сервис немедленно — для этого используйте start или restart.

Маскирование (mask / unmask)

Иногда нужно гарантированно запретить запуск сервиса — даже случайный или зависимый запуск. Для этого используется mask, который перенаправляет unit на /dev/null.

sudo systemctl mask nginx    # сервис нельзя будет запустить ни вручную, ни зависимостями
sudo systemctl unmask nginx  # снять маску

Когда применять mask:

  • Нужно полностью заблокировать конфликтующий сервис (например, запрещаем start сетевого демона, если используем другой).
  • Убрать возможность случайного запуска устаревших, небезопасных демонов (telnet, rsh и т.п.).
  • Тестирование: временно запрещаем сервис, чтобы проверить поведение зависимостей.

Работа с изменениями unit-файлов

После добавления/изменения unit-файла systemd нужно пересканировать. Это делается командой:

sudo systemctl daemon-reload

Дальше обычно перезапускают сервис:

sudo systemctl restart имя_сервиса

Если забыть daemon-reload, systemd будет использовать старую конфигурацию, даже если файл на диске изменён.

Targets (аналог runlevels)

В systemd понятие runlevel заменено на targets — наборы unit'ов, которые запускаются вместе.

  • multi-user.target — многопользовательский режим без графики (аналог runlevel 3).
  • graphical.target — графический режим (аналог runlevel 5).
  • rescue.target — аварийный режим.
systemctl get-default               # посмотреть текущую цель
sudo systemctl set-default multi-user.target  # установить дефолтную цель
sudo systemctl isolate multi-user.target     # переключиться сразу

Логи: journalctl

systemd использует журнал (journald). Для просмотра логов сервиса применяют:

journalctl -u nginx         # все логи для unit
journalctl -u nginx -f      # следить в реальном времени

Полезно сочетать с временными фильтрами: --since, --until, и с -p (уровень приоритета).

Полезные команды и списки

systemctl list-units --type=service        # активные службы
systemctl list-unit-files --type=service     # все файлы unit (включая disabled)
systemctl is-active ssh                       # быстро узнать, активен ли сервис
systemctl list-dependencies имя_сервиса       # показать зависимости

Типичные ошибки и их решения

1) Изменил unit-файл, но изменения не применились
sudo systemctl daemon-reload
sudo systemctl restart имя_сервиса

Обязательная последовательность: daemon-reload → перезапуск/старт.

2) Failed to start ...

Проверяем статус и логи:

sudo systemctl status имя_сервиса
journalctl -xeu имя_сервиса

Частые причины: ошибка в пути в ExecStart, неверные права, конфликт портов, отсутствующие зависимости.

3) Сервис запускается вручную, но не стартует при загрузке
systemctl is-enabled имя_сервиса
sudo systemctl enable имя_сервиса

Проверьте также, не мешают ли target'ы или маскировка, и нет ли ошибок в [Install] блока unit-файла (например, WantedBy=).

4) "Unit not found"

Скорее всего unit-файл отсутствует или не установлен:

systemctl list-unit-files | grep имя_сервиса

Возможные причины: пакет не установлен, unit называется иначе, или unit расположен в нестандартном каталоге.

5) Unit помечен как masked
systemctl is-enabled имя_сервиса   # покажет "masked"
sudo systemctl unmask имя_сервиса

Типы unit-файлов (кратко)

  • .service — сервис/демон.
  • .socket — сокет-активация; может запускать .service при подключении.
  • .timer — периодические/отложенные задания (альтернатива cron).
  • .mount — описание точки монтирования.
  • .target — агрегатор unit'ов (аналог runlevel).

Короткие рекомендации (best practices)

  • Редактируйте unit-файлы в /etc/systemd/system/ (локальные переопределения не затрутся при обновлении пакета).
  • После правок — всегда daemon-reload, затем restart или try-restart.
  • Используйте Restart=on-failure аккуратно; логируйте причины падений (через StandardOutput/StandardError или journald).
  • Для временной блокировки сервиса применяйте mask. Для обычного отключения — disable.