Цели (targets)
Цель — группа юнитов, до которой systemd доводит загрузку:
multi-user.target у сервера, rescue.target и emergency.target для
починки. Подробно — boot-targets.
Init-система и менеджер служб (PID 1): юниты, цели, зависимости, журналы.
systemctl status nginx
состояние
systemctl start nginx
запустить сейчас
systemctl stop nginx
остановить сейчас
systemctl enable nginx
включить автозапуск
systemctl reload nginx
перечитать конфиг без обрыва
systemctl daemon-reload
после правки юнит-файлов
journalctl -u nginx -f
логи службы в реальном времени
systemd-analyze blame
тайминги загрузки
systemd — первый процесс системы (PID 1) и менеджер служб большинства современных дистрибутивов. Он запускает и контролирует юниты, разрешает зависимости между ними и параллелит загрузку.
Типы юнитов:
| Тип | Расширение | Что описывает |
|---|---|---|
| service | .service |
служба/демон (nginx, sshd) |
| socket | .socket |
сокет активации |
| timer | .timer |
расписание (замена cron) |
| mount | .mount |
точку монтирования |
| target | .target |
группу юнитов (аналог runlevel) |
Управление — через systemctl, журналы — через journalctl.
Строки [Unit] отвечают на два вопроса: что запустить вместе и в каком
порядке.
| Строка | Что делает |
|---|---|
Wants=x |
при запуске юнита запустить и x; падение x юниту не мешает |
Requires=x |
то же, и если x остановят — остановится и юнит; с After=x юнит не стартует, когда x не запустился |
After=x |
если оба запускаются, этот стартует после того, как x закончил запуск |
Before=x |
то же в другую сторону |
After= и Before= задают только порядок: если
x никто не запускает, After=x его не запустит. Поэтому зависимость
пишут парой — Wants=x и After=x. Wants= без After= запускает оба
юнита одновременно, и служба стартует раньше, чем готово то, что ей
нужно. Requires= без After= тоже не ждёт: служба уже работает, когда
зависимость упала. Юнит из Wants=, которого нет, systemd пропускает
молча, из Requires= — отказывается запускать службу. Проверить юнит
после правки — systemd-analyze, цепочку ожидания при
загрузке — systemd-analyze.
Юниты ищутся в (по возрастанию приоритета):
/lib/systemd/system/ — пакетные (не редактировать);/etc/systemd/system/ — локальные переопределения (редактировать здесь).Структура .service:
Юнит из пакета правят через drop-in: обновление пакета
перезапишет сам файл юнита, а drop-in останется. Drop-in — файл .conf в
каталоге /etc/systemd/system/<юнит>.d/. systemd читает юнит, затем
drop-in'ы по алфавиту, и их строки дополняют или заменяют строки юнита.
systemctl edit сам делает daemon-reload. После ручной правки без
daemon-reload systemd работает со старой версией юнита. Ключ вроде
ExecStart= в drop-in'е добавляет вторую команду; чтобы заменить первую,
перед новой строкой ставят пустую ExecStart=.
Ключ в чужой секции systemd пропускает: LimitNOFILE= под [Unit] не
действует, служба получает лимит по умолчанию. Предупреждение видно в
журнале после daemon-reload и в systemd-analyze verify — код у него
всё равно 0:
Юнит .socket держит порт вместо службы: systemd слушает сам и запускает
одноимённую службу при первом соединении. Учебная пара —
demo-sock.socket и demo-sock.service:
ListenStream=8085 — только порт, без адреса: сокет слушает все адреса,
IPv4 и IPv6. До первого запроса порт держит процесс systemd, служба
inactive:
Адрес меняют drop-in'ом. ListenStream= — список: пустая строка
сбрасывает адреса из юнита, без неё новый адрес добавится к старому.
restart сокета перезапускает и службу с Requires= на него:
MainPID службы сменился (2769 → 2838). Остановить одну службу мало —
следующее соединение запустит её снова, а systemctl stop предупредит:
Закрыть порт совсем — sudo systemctl disable --now demo-sock.socket.
Цель — группа юнитов, до которой systemd доводит загрузку:
multi-user.target у сервера, rescue.target и emergency.target для
починки. Подробно — boot-targets.
systemctl status <unit> — код выхода и последние строки журнала.journalctl -xeu <unit> — подробности с пояснениями.sudo systemctl daemon-reload.Проверь имя и путь: systemctl cat <unit>. Если правил файл — daemon-reload.
systemd-analyze critical-chain — кто держал загрузку; порядок разбора —
systemd-analyze.
Есть неточность? Сообщить об ошибке в статье