Гид по технологиям

Управление службами systemd с помощью systemctl

6 min read Linux Обновлено 29 Dec 2025
Управление службами systemd через systemctl
Управление службами systemd через systemctl

Инженер смотрит на компьютер, пьёт чай

Управление службами — одна из ключевых задач системного администратора Linux. Владение инструментарием systemd и его клиентом systemctl также полезно пользователям, которым иногда приходится включать, отключать или отлаживать фоновые сервисы.

Эта инструкция охватывает основные приёмы работы с systemd через systemctl, расширенные приёмы (журналы, маскирование, перезагрузка без остановки) и практические сценарии для быстрого реагирования в продакшене.

Что такое systemd

Systemd — это менеджер систем и служб в Linux. Он используется по умолчанию во многих дистрибутивах: Ubuntu, RHEL/Fedora, OpenSUSE, Arch Linux и других. Systemd пришёл на смену классическим менеджерам вроде System V init и Upstart.

Ключевые особенности в одной строке:

  • Запуск служб параллельно для ускорения загрузки.
  • «Socket activation» — запуск сервиса по требованию при обращении к сокету.
  • Таймеры вместо cron для периодических задач.
  • Управление точками монтирования, сессиями и таргетами (аналог уровней запуска).

Systemd управляет не только процессами: оно работает с точками монтирования, сетями, таймерами и другими единицами (unit-ами).

Как проверить, используется ли systemd

Если на системе есть каталог /usr/lib/systemd или /lib/systemd, скорее всего работает systemd. Дополнительно можно выполнить:

systemctl --version
systemd --version

Проверка статуса службы

Основная команда для диагностики — status. Она показывает, работает ли служба, PID, использование памяти и недавние записи журналов.

Пример: проверка docker

systemctl status docker.service

Вывод статуса службы в Linux

Важно: systemctl понимает имена unit-ов с или без суффикса .service; оба варианта допустимы.

Список доступных служб

Чтобы получить список файлы-юнитов и их состояние (enabled/disabled/masked и т.д.), используйте:

systemctl list-unit-files --type=service --all

Для списка активных юнитов (включая сокеты, таймеры и т. п.):

systemctl list-units --type=service --all

Запуск, остановка и перезапуск служб

  • Остановить службу:
systemctl stop docker.service
  • Запустить службу:
systemctl start docker.service
  • Перезапустить (stop + start):
systemctl restart docker.service
  • Плавная перезагрузка (если сервис поддерживает):
systemctl reload docker.service
  • Выполнить enable и сразу запустить:
systemctl enable --now docker.service

Почему останавливают службы: экономия ресурсов, уменьшение площади атаки, устранение конфликтов при обновлениях.

Включение и отключение запуска при загрузке

  • Включить автозапуск при загрузке:
systemctl enable nginx.service
  • Отключить автозапуск:
systemctl disable nginx.service
  • Проверить, включён ли автозапуск:
systemctl is-enabled nginx.service

Разница: enable управляет автозапуском при загрузке; start просто запускает текущую сессию.

Маскирование и размаскирование служб

Маскирование блокирует запуск службы даже если другой unit попытается её запустить:

systemctl mask cups.service
systemctl unmask cups.service

Маскируют службы при жёстких требованиях безопасности или когда нужно предотвратить случайный запуск.

Полезные команды для администрирования

  • Просмотр логов службы (через journalctl):
journalctl -u docker.service
# последние 200 строк
journalctl -u docker.service -n 200
# в режиме реального времени
journalctl -u docker.service -f
  • Перечитать конфигурацию systemd после изменения unit-файлов:
systemctl daemon-reload
  • Посмотреть детали unit-а:
systemctl show nginx.service
  • Открыть unit-файл для правки (откроет копию в /etc/systemd/system для правки):
systemctl edit --full nginx.service
  • Узнать, активна ли служба сейчас:
systemctl is-active nginx.service  # active, inactive, failed

Когда использовать reload вместо restart

reload полезен, если сервис умеет перечитать конфигурацию без перезапуска (graceful). Restart завершает процесс и запускает новый — возможна кратковременная потеря сервиса.

Проверьте документацию конкретного демона или используйте systemctl reload-or-restart.

Журнал и отладка: порядок действий при проблеме

  1. Проверить статус:
systemctl status myservice.service
  1. Просмотреть логи:
journalctl -u myservice.service -b
  1. Попробовать gentle reload:
systemctl reload myservice.service
  1. Если не помогло — перезапустить:
systemctl restart myservice.service
  1. Если служба завершилась с ошибкой — посмотреть systemctl show и журнал systemd (возможно, есть код возврата или coredump).

  2. Если проблема связана с unit-файлом, отредактировать и выполнить systemctl daemon-reload.

Шпаргалка: часто используемые команды

ДействиеКоманда
Проверить статусsystemctl status <имя>.service
Запуститьsystemctl start <имя>.service
Остановитьsystemctl stop <имя>.service
Перезапуститьsystemctl restart <имя>.service
Перезагрузить конфигурацию без остановкиsystemctl reload <имя>.service
Включить автозапускsystemctl enable <имя>.service
Выключить автозапускsystemctl disable <имя>.service
Маскироватьsystemctl mask <имя>.service
Размаскироватьsystemctl unmask <имя>.service
Посмотреть логиjournalctl -u <имя>.service -f
Прочитать юнитsystemctl show <имя>.service
Перечитать systemdsystemctl daemon-reload

Сравнение: systemctl vs старые init-скрипты

  • System V: последовательный запуск, скрипты в /etc/init.d.
  • systemd: юниты, параллельный запуск, единая модель, socket/timer activation.

Когда старые скрипты остаются — systemd предоставляет обёртки, но лучше писать unit-файлы.

Роли и чеклист: администратор и обычный пользователь

Администратор (sysadmin) чеклист:

  • Проверить статус критичных сервисов после загрузки.
  • Включить мониторинг и алерты по статусу сервиса.
  • Настроить ограничение ресурсов через Unit (MemoryLimit/CPUQuota).
  • Маскировать ненужные сервисы в многопользовательской среде.
  • Перед обновлением: stop -> backup -> upgrade -> start -> verify.

Пользователь чеклист:

  • Использовать systemctl только для своих сервисов или с sudo.
  • Сначала смотреть логи через journalctl, затем открывать issue.
  • Для локальных разработок использовать enable –now для удобства.

Безопасность и жёсткие ограничения

systemd позволяет задавать ограничения на уровни ресурса в unit-файле:

[Service]
MemoryMax=500M
CPUQuota=50%

Это помогает ограничить влияние «шумных» сервисов и улучшить устойчивость хоста.

Альтернативные подходы и когда systemd не подойдёт

  • В контейнерах minimal базовые образы часто не используют systemd; там принято запускать один процесс как PID 1.
  • В системах с крайне простыми требованиями init может быть достаточно, и systemd будет избыточен.

Ментальные модели (как думать о systemd)

  • Unit = сущность, которой systemd управляет (service, socket, timer, mount, target).
  • Target = группа юнитов, похожая на «runlevel».
  • Socket activation = systemd запускает сервис при первом обращении к сокету.

Процедура отката при неудачного обновления сервиса

  1. Остановить сервис: systemctl stop myservice
  2. Восстановить предыдущую версию (из резервной копии).
  3. systemctl daemon-reload
  4. Запустить сервис: systemctl start myservice
  5. Проверить логи и статус.

Decision flowchart

flowchart TD
  A[Проблема с сервисом] --> B{Сервис запущен?}
  B -- Да --> C[Посмотреть логи: journalctl -u]
  B -- Нет --> D[Попробовать запустить: systemctl start]
  C --> E{Логи содержат ошибку?}
  D --> F{Старует ли?}
  F -- Да --> C
  F -- Нет --> G[Проверить unit-файл и зависимости]
  E -- Да --> H[Исправить конфиг / обратиться к разработчику]
  E -- Нет --> I[Перезапустить: systemctl restart]
  H --> I
  G --> I
  I --> J[Проверить состояние и логи]

Критерии приёмки

  • Служба должна стартовать без ошибок: systemctl is-active -> active.
  • Логи не содержат критических ошибок за последние 5 минут: journalctl -u <имя> -n 100 | grep -i error -> пусто.
  • После включения автозапуска служба стартует при перезагрузке.

Частые ошибки и когда systemctl «не работает»

  • Использование неправильного имени unit-а (забудьте .service).
  • Отсутствие прав (не используйте systemctl без sudo для системных сервисов).
  • Unit-файл содержит ошибки синтаксиса — systemctl daemon-reload покажет предупреждения.
  • В контейнерах systemd может не быть установлен.

Важно: не выдумывайте «fixes» в unit-файлах без тестирования на staging.

Локальные рекомендации и совместимость

  • На Ubuntu: systemd — дефолт, service-команда всё ещё доступна как алиас.
  • В Alpine Linux по умолчанию используется OpenRC, а не systemd.
  • Для контейнеров проверьте, нужен ли systemd, или достаточно процесса-демона.

Резюме

Systemctl — основной инструмент для управления systemd: он позволяет управлять жизненным циклом служб, просматривать логи, настраивать автозапуск и ограничивать ресурсы. Знание набора команд и типичных сценариев отладки ускоряет восстановление работоспособности и повышает безопасность системы.

Кратко:

  • Проверяйте статус и логи первым делом.
  • Используйте enable/disable для автозапуска.
  • Reload если поддерживается, restart если нужно полностью перезапустить.
  • Маскируйте сервисы, которые никогда не должны запускаться.

Дополнительные ресурсы: man systemctl, man journalctl.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключить доступ к Редактору реестра в Windows 10
Windows

Отключить доступ к Редактору реестра в Windows 10

Настройка уведомлений в Slack — полное руководство
Инструменты

Настройка уведомлений в Slack — полное руководство

Пространственное аудио Netflix — руководство
Streaming

Пространственное аудио Netflix — руководство

Как включить Lossless в Apple Music — руководство
Музыка

Как включить Lossless в Apple Music — руководство

Deezer на HomePod — как включить
Музыка

Deezer на HomePod — как включить

Вернуть старый дизайн Facebook
Социальные сети

Вернуть старый дизайн Facebook