systemd — система инициализации и управления службами в Linux, потеснившая в 2010-е годы традиционный init. Главная особенность — параллельный запуск служб при загрузке, за счёт чего система стартует заметно быстрее.
Все примеры дальше крутятся вокруг одной службы myapp — как сделать
собственную, показано в разделе «Создание службы».
Основные понятия#
- Юнит — базовая единица управления systemd: конфигурационный файл, описывающий ресурс (службу, сокет, устройство, точку монтирования)
- Служба — тип юнита для демонов и процессов (
*.service) - Таргет — группа юнитов, активируемых вместе; наследник runlevel традиционного init
- cgroup (контрольная группа) — механизм ядра: группирует процессы для учёта и ограничения ресурсов; systemd через cgroup отслеживает процессы каждой службы
Соответствие runlevel и таргетов:
| Runlevel | Target | Что это |
|---|---|---|
| 0 | poweroff.target | выключение |
| 1 | rescue.target | однопользовательский режим (восстановление) |
| 3 | multi-user.target | многопользовательский без графики (серверы) |
| 5 | graphical.target | многопользовательский с графикой |
| 6 | reboot.target | перезагрузка |
Управление службой#
# Запустить
systemctl start myapp
# Остановить
systemctl stop myapp
# Перезапустить (stop + start)
systemctl restart myapp
# Перечитать конфиг службы без перезапуска
systemctl reload myapp
# Проверить статус: состояние, дерево процессов, свежие строки лога
systemctl status myapp
Суффикс
.serviceнеобязателен:systemctl start myappиsystemctl start myapp.service— одно и то же. По статье пишем без него.
Автозагрузка#
# Включить автозапуск и запустить службу сразу
systemctl enable --now myapp
# Включить только автозапуск
systemctl enable myapp
# Убрать из автозагрузки
systemctl disable myapp
# Запретить совсем (замаскировать: не запустится даже вручную)
systemctl mask myapp
# Вернуть обратно
systemctl unmask myapp
enableсам службу не запускает — она стартует при следующей загрузке. Чтобы включить автозапуск и сразу поднять службу —enable --now.
Создание службы#
Файл юнита кладётся в /etc/systemd/system/ — здесь это myapp.service:
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Выбор Type= под поведение процесса:
| Type | Когда использовать |
|---|---|
| simple | процесс работает на переднем плане и не демонизируется сам (по умолчанию) |
| forking | процесс сам уходит в фон в стиле классических Unix-демонов |
| oneshot | разовая задача: отработала и завершилась |
| notify | как simple, но процесс сам сообщает о готовности через sd_notify |
Restart=on-failure перезапускает службу только при падении; always — и
после штатного завершения тоже.
Принимаем юнит в работу:
# Перечитать юниты после изменения файлов
sudo systemctl daemon-reload
# Включить автозагрузку и запустить
sudo systemctl enable --now myapp
Работа с таргетами#
# Список доступных таргетов
systemctl list-units --type=target
# Дерево зависимостей таргета
systemctl list-dependencies graphical.target
# Переключить текущую сессию на режим без графики
sudo systemctl isolate multi-user.target
isolateгасит всё, чего нет в целевом таргете и его зависимостях — включая запущенные графические приложения при уходе изgraphical.target.
Дефолтный таргет для будущих загрузок:
# Какой таргет будет активирован при загрузке
systemctl get-default
# Сделать графический режим дефолтом
sudo systemctl set-default graphical.target
Перезагрузка и выключение#
# Перезагрузить систему
systemctl reboot
# Выключить
systemctl poweroff
Обе команды — тонкие обёртки над соответствующими таргетами
(reboot.target, poweroff.target).
Логи службы (journalctl)#
# Все логи службы
journalctl -u myapp
# С последней загрузки системы
journalctl -u myapp -b
# Последние 100 строк, без пейджера
journalctl -u myapp -n 100 --no-pager
# В реальном времени
journalctl -u myapp -f
# За интервал времени
journalctl -u myapp --since "2026-06-30 10:00" --until "2026-06-30 12:00"
Для уже установленных служб удобно смотреть их юнит с учётом дроп-инов:
systemctl cat myapp, а править —sudo systemctl edit myapp.