ITcompressor IT — сжато и по делу
← Назад к статьям

Systemd

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.

← Назад к статьям