Если вы администрируете серверы на базе Linux, знакомство с systemctl
неизбежно. Эта утилита стала стандартом де-факто для управления системными процессами в большинстве современных дистрибутивов. Разберём, как эффективно использовать этот инструмент и избежать типичных ошибок при работе с системными службами.
Когда вы включаете компьютер с Linux, первым делом запускается процесс с идентификатором 1 — это и есть systemd
. Он берёт на себя координацию всей системы: от запуска базовых сервисов до управления сетевыми подключениями и точками монтирования.
В отличие от предшественников (таких как SysV Init
), systemd
использует параллельный запуск совместимых компонентов. Представьте: вместо того чтобы ждать, пока каждый сервис запустится по очереди, система стартует несколько независимых процессов одновременно. Результат — ваш сервер готов к работе в разы быстрее.
Systemctl
— это ваш пульт управления systemd. Через него проходят все команды: от простого "запустить веб-сервер" до сложных операций с зависимостями и ресурсными лимитами.
Первое, что нужно уметь — проверять, что происходит со службой прямо сейчас:
$ systemctl status apache2
Команда покажет:
Нужна только быстрая проверка "работает/не работает"?
$ systemctl is-active apache2
Получите лаконичный ответ: active
или inactive
.
Стартуем службу прямо сейчас:
$ sudo systemctl start apache2
Останавливаем работающий процесс:
$ sudo systemctl stop apache2
Полная перезагрузка (с остановкой всех соединений):
$ sudo systemctl restart apache2
Мягкая перезагрузка конфигурации без разрыва соединений:
$ sudo systemctl reload apache2
Критический момент: Эти действия временные. После перезагрузки сервера всё вернётся к настройкам автозапуска.
Чтобы служба запускалась вместе с системой:
$ sudo systemctl enable apache2
Systemd
создаст необходимые ссылки в директориях запуска.
Убрать из автозагрузки:
$ sudo systemctl disable apache2
Узнать текущий статус автозапуска:
$ systemctl is-enabled apache2
Лайфхак: Комбинированная команда включает автозапуск и сразу стартует службу:
$ sudo systemctl enable --now apache2
Systemd
оперирует понятием "юнит" — это абстракция для любого управляемого объекта. Службы — лишь один из видов юнитов.
service
— Фоновые процессы и демоны.socket
— Сетевые или локальные сокеты.device
— Аппаратные устройства.mount
— Точки монтирования дисков.automount
— Автомонтирование по требованию.target
— Логические группы юнитов.timer
— Планировщик задач (современная замена cron).Все активные юниты сейчас:
$ systemctl list-units
Абсолютно все юниты, включая отключённые:
$ systemctl list-units --all
Только службы:
$ systemctl list-units --type=service
Показать проблемные юниты:
$ systemctl list-units --state=failed
Полный список файлов юнитов в системе:
$ systemctl list-unit-files
Содержимое конкретного юнита:
$ systemctl cat apache2.service
Узнать физическое расположение файла:
$ systemctl show -p FragmentPath apache2.service
Systemctl
даёт доступ к огромному объёму информации о каждом юните.
Все параметры службы:
$ systemctl show apache2
Вывод будет длинным. Фильтруем по конкретному параметру:
$ systemctl show apache2 -p Requires
Что требуется для запуска этой службы:
$ systemctl list-dependencies apache2
Обратная связь — какие службы зависят от данной:
$ systemctl list-dependencies --reverse apache2
Иногда нужно гарантированно предотвратить запуск службы — даже если кто-то попытается сделать это вручную.
Полная блокировка:
$ sudo systemctl mask apache2
Systemd
создаст символическую ссылку на /dev/null
, делая юнит недоступным.
Снятие блокировки:
$ sudo systemctl unmask apache2
Когда это нужно: При миграции на другой веб-сервер (например, с Apache на Nginx) можно замаскировать старую службу, чтобы исключить случайный запуск.
Используйте встроенный механизм:
$ sudo systemctl edit apache2
Откроется редактор для создания файла-дополнения (drop-in
). Ваши настройки сохранятся в
/etc/systemd/system/apache2.service.d/override.conf
и переживут обновление пакета.
Редактирование полного файла юнита:
$ sudo systemctl edit --full apache2
После любых изменений обязательно:
$ sudo systemctl daemon-reload
Системные файлы (устанавливаемые пакетами):
/lib/systemd/system/
— не трогайте их напрямую
Пользовательские настройки (высший приоритет):
/etc/systemd/system/
— ваши изменения здесь
Временные юниты:
/run/systemd/system/
Target
определяет набор активных служб для конкретного режима работы:
poweroff.target
— Выключение
rescue.target
— Режим восстановления (однопользовательский)
multi-user.target
— Консольный многопользовательский режим
graphical.target
— Графический интерфейс
reboot.target
— Перезагрузка
Какой target
активен по умолчанию:
$ systemctl get-default
Установить другой target по умолчанию:
$ sudo systemctl set-default multi-user.target
Переключиться прямо сейчас:
$ sudo systemctl isolate graphical.target
Выключение:
$ sudo systemctl poweroff
Перезагрузка:
$ sudo systemctl reboot
Режим сна (RAM):
$ sudo systemctl suspend
Гибернация (диск):
$ sudo systemctl hibernate
Комбинированный режим:
$ sudo systemctl hybrid-sleep
Systemd
ведёт детальную статистику запуска системы.
Общее время загрузки:
$ systemd-analyze
Какие службы тормозят загрузку:
$ systemd-analyze blame
Покажет отсортированный список с временем инициализации каждой службы.
Критический путь загрузки:
$ systemd-analyze critical-chain
Визуализирует цепочку зависимостей, определившую общее время старта.
Практика оптимизации: Найдите службы с большим временем загрузки. Проверьте, можно ли отключить ненужные или настроить отложенный старт через socket activation.
Systemd
централизованно собирает логи всех компонентов. Доступ через journalctl
:
Весь журнал:
$ journalctl
Логи конкретной службы:
$ journalctl -u apache2
Режим реального времени (аналог tail -f
):
$ journalctl -u apache2 -f
Последние 100 записей:
$ journalctl -u apache2 -n 100
С текущей загрузки:
$ journalctl -b
За определённый период:
$ journalctl --since "2025-01-15" --until "2025-01-20"
$ journalctl --since "30 minutes ago"
Только ошибки:
$ journalctl -p err
Управление размером журнала:
Удалить старше 2 недель:
$ sudo journalctl --vacuum-time=14d
Оставить максимум 1 ГБ:
$ sudo journalctl --vacuum-size=1G
Создаём /etc/systemd/system/myservice.service
:
[Unit]
Description=My Custom Application Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Расшифровка секций:
[Unit
] — Общая информация
Description
— Описание для человекаAfter
— Запускаться после указанных юнитовWants
— Мягкая зависимость (не критична)[Service
] — Параметры запуска
Type
— Тип процессаUser/Group
— От чьего имени запускатьWorkingDirectory
— Рабочая директорияExecStart
— Команда запускаRestart
— Политика перезапуска при сбое[Install
] — Интеграция в систему
WantedBy
— В какой target
включитьsimple
— Процесс из ExecStart
и есть основнойforking
— Создаёт дочерний процесс, родитель завершаетсяoneshot
— Выполняется и завершается (для скриптов)notify
— Сообщает о готовности через sd_notify
idle
— Ждёт завершения других задач$ sudo systemctl daemon-reload
$ sudo systemctl enable myservice
$ sudo systemctl start myservice
$ systemctl status myservice
Смотрим подробности:
$ systemctl status myservice
Углубляемся в логи:
$ journalctl -u myservice -n 200 --no-pager
Проверяем синтаксис unit-файла:
$ systemd-analyze verify /etc/systemd/system/myservice.service
Дерево зависимостей:
$ systemctl list-dependencies myservice --all
Поиск циклических зависимостей:
$ systemctl show -p After,Before,Requires,Wants myservice
Проверьте, может ли пользователь службы запустить исполняемый файл:
$ sudo -u appuser /opt/myapp/bin/start
Лимит процессорного времени:
$ sudo systemctl set-property myservice CPUQuota=30%
Ограничение памяти:
$ sudo systemctl set-property myservice MemoryMax=512M
Мониторинг потребления ресурсов:
$ systemd-cgtop
Служба стартует только при первом обращении к сокету. Создаём /etc/systemd/system/myapp.socket
:
[Unit]
Description=My App Socket
[Socket]
ListenStream=9000
Accept=no
[Install]
WantedBy=sockets.target
Служба остаётся выключенной, пока не придёт подключение на порт 9000.
Создаём /etc/systemd/system/backup.timer
:
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
Активация:
$ sudo systemctl enable backup.timer
$ sudo systemctl start backup.timer
Просмотр всех таймеров:
$ systemctl list-timers --all
/lib/systemd/system
— используйте systemctl edit
.daemon-reload
после ручных изменений.systemctl status
перед production
.Description
.User/Group
.Systemctl
— это швейцарский нож администратора Linux. Его возможности выходят далеко за рамки простого "запустить/остановить". Грамотное использование systemd
позволяет построить надёжную, быстро загружающуюся систему с предсказуемым поведением служб.
Переход на systemd
когда-то вызвал споры в сообществе, но сегодня это стандарт индустрии. Параллельная загрузка, умное управление зависимостями, встроенное логирование и контроль ресурсов — всё это делает systemd
незаменимым для современной инфраструктуры.
Инвестируйте время в изучение systemctl — это окупится многократно при первом же серьёзном инциденте или задаче оптимизации.