linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/systemd

kb/processes ── Процессы и ресурсы ── intermediate

systemd - init и менеджер сервисов

systemd - init-система Linux: PID 1, который запускает всё остальное, следит за зависимостями, перезапускает упавшее, агрегирует логи.

view as markdownaka: systemd-init, init-system, pid-1

Что делает PID 1

Когда ядро загрузилось - оно стартует один процесс с PID 1. На современных Linux это systemd. Его задачи:

  • Запустить нужные сервисы при старте системы
  • Следить за их состоянием, перезапускать упавшие
  • Управлять зависимостями («старт docker после network»)
  • Подбирать «осиротевшие» процессы (parent умер - мы становимся новым)
  • Логировать всё через journald
  • Управлять cgroups для лимитов и изоляции

Unit-файлы

Всё что systemd умеет делать = unit. Виды:

  • .service - обычный демон (nginx, ssh, postgres)
  • .socket - слушать сокет, запустить сервис при первом подключении
  • .timer - cron-replacement: запускать unit по расписанию
  • .mount / .automount - монтирование ФС
  • .target - группа unit'ов (как runlevel: multi-user.target, graphical.target)
  • .path - реагировать на появление/изменение файла
  • .slice - узел иерархии cgroup'ов

Расположение:

  • /lib/systemd/system/ - от пакетов
  • /etc/systemd/system/ - твои локальные / drop-in'ы (приоритет)

Минимальный service unit

ini
[Unit]
Description=My App
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp --config=/etc/myapp.yml
Restart=on-failure
RestartSec=5
User=myapp
Group=myapp
[Install]
WantedBy=multi-user.target

Положить в /etc/systemd/system/myapp.service, потом:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now myapp

Type - модель запуска

  • simple - ExecStart = бинарь который НЕ форкается; default
  • forking - старая школа (бинарь форкает дочерку и выходит); PIDFile= нужен
  • notify - приложение шлёт READY=1 через sd_notify когда готово
  • oneshot - выполнить и выйти (для скриптов/настроек)
  • idle - простой, но запустить когда другие units стабилизировались

Зависимости

  • Wants= - мягкая зависимость (мы хотим, но не критично)
  • Requires= - жёсткая (если зависимость упала - мы тоже)
  • After= / Before= - порядок (не зависимость, а очерёдность!)
  • Conflicts= - взаимоисключение

Изоляция через cgroups

systemd кладёт каждый сервис в свой cgroup и поддерживает sandboxing:

ini
[Service]
MemoryMax=512M
CPUQuota=50%
PrivateTmp=yes              # свой /tmp
ProtectSystem=strict         # /usr, /etc r/o
ProtectHome=yes              # /home, /root недоступны
NoNewPrivileges=yes          # запрет setuid-эскалации
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

Это даёт большую часть «контейнеризации» без Docker.

Targets вместо runlevels

Старое vs новое:

runlevelsystemd target
0poweroff.target
1rescue.target
3multi-user.target (CLI)
5graphical.target (GUI)
6reboot.target
bash
systemctl get-default                    # текущий default-target
sudo systemctl set-default multi-user.target
systemctl isolate rescue.target          # перейти в target прямо сейчас

Дебаг

bash
systemctl status myapp                   # state + последние логи
journalctl -u myapp -f                   # tail логов
systemd-analyze blame                    # кто медленно стартовал
systemd-analyze critical-chain           # критический путь загрузки
systemctl list-dependencies myapp

§ команды

bash
systemctl --failed

Все упавшие сервисы - первое что смотришь после загрузки

bash
systemd-analyze blame | head

Топ медленных юнитов при старте - оптимизировать boot-time

bash
sudo systemctl edit myapp

Открыть drop-in override без правки оригинального unit'а

bash
systemctl cat myapp

Показать ИТОГОВЫЙ unit (с применёнными override'ами)

bash
systemctl daemon-reload

После правки unit-файлов обязательно - иначе systemd видит старую версию

§ см. также

  • cmd-systemctlsystemctl - управление сервисами systemd`systemctl` - главный CLI для управления unit'ами systemd: сервисами, таймерами, маунтами, сокетами. Замена SysV-init/`service` на современных дистро.
  • cmd-journalctljournalctl - журнал systemd`journalctl` читает binary-журнал systemd-journald. Это центральный лог системы: kernel, systemd-сервисы, syslog - всё через один интерфейс.
  • cgroupscgroups (v2)cgroups v2 - иерархическая виртуальная FS под `/sys/fs/cgroup` через которую ядро лимитирует CPU/память/I/O процессов. Docker/k8s/systemd пишут сюда.
  • cgroups-v2-deepcgroups v2 - unified hierarchy, PSI, eBPF controlcgroups v2 - один tree вместо отдельных hierarchies на controller. Чистая семантика, новые fields (memory.high, io.cost). PSI показывает resource pressure. eBPF может управлять resources. Default в RHEL 9, Ubuntu 22+.
  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки