Управление службами 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Важно: 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.
Журнал и отладка: порядок действий при проблеме
- Проверить статус:
systemctl status myservice.service- Просмотреть логи:
journalctl -u myservice.service -b- Попробовать gentle reload:
systemctl reload myservice.service- Если не помогло — перезапустить:
systemctl restart myservice.serviceЕсли служба завершилась с ошибкой — посмотреть
systemctl showи журнал systemd (возможно, есть код возврата или coredump).Если проблема связана с 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 |
| Перечитать systemd | systemctl 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 запускает сервис при первом обращении к сокету.
Процедура отката при неудачного обновления сервиса
- Остановить сервис: systemctl stop myservice
- Восстановить предыдущую версию (из резервной копии).
- systemctl daemon-reload
- Запустить сервис: systemctl start myservice
- Проверить логи и статус.
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.
Похожие материалы
Отключить доступ к Редактору реестра в Windows 10
Настройка уведомлений в Slack — полное руководство
Пространственное аудио Netflix — руководство
Как включить Lossless в Apple Music — руководство
Deezer на HomePod — как включить