В рамках этой заметки представляю список полезностей для работы c Systemd. Это самая популярная на текущий момент система инициализации, пришедшая на смену SystemV (SysV).

Введение

Система инициализации запускается после первой загрузки ядра, затем запускает все процессы, в работающей системе. С ее помошью можно также запускать различные режимы (runlevels) и управлять/отслеживать работу служб/демонов.

Управление ресурсом системы описывается в Unit - файлах, так называемые конфигурационных файлы для Systemd. Ресурс описывамый в них может быть чем угодно: сервисом, сокетом, устройством, точкой монтирования, таймером и etc..

Юнит-файл определяет:

  • Как запустить службу (через ExecStart),

  • Когда её запускать (через зависимости и WantedBy),

  • Какие действия предпринимать при сбое (Restart, RestartSec),

  • Под каким пользователем и окружением запускать,

  • Что должно быть запущено до или после нее (After, Before).

Unit-файлы

Хранятся юнит-файлы, зависит от дистрибутива, но как правило тут:

  • /usr/lib/systemd/system/ - Системные юниты, установленные пакетами.

  • /etc/systemd/system/ - Пользовательские юниты, переопределяющие или добавляющие новые.

  • /run/systemd/system/ - Временные юниты (в оперативной памяти).

Юнит-файлы размещенные в /etc/systemd/system/ имееют наивысший приоритет чем /run и /usr/lib.

В качестве примера, ниже табличка с примерами типов юнитов:

Тип файла Расширение Назначение
service .service Управление сервисами
socket .socket Сокеты (активируют сервисы)
timer .timer Планирование задач (аналог cron)
mount .mount Монтаж файловых систем
path .path Отслеживание файлов/каталогов
target .target Группировка юнитов (как runlevel)
device .device Устройства

Но на практике же, самой частой задачей является создаение Systemd юнита для запуска сервиса. Пример конфигурации:

[Unit]
Description=My Happy Java App
After=network.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
Restart=on-failure
RestartSec=5
Environment=ENV=production

[Install]
WantedBy=multi-user.target

Директивы:

  • Description — описание юнита,
  • After — юнит будет запущен после network.target,
  • Type=simple — процесс стартует напрямую (без forking),
  • ExecStart — команда для запуска,
  • Restart — перезапуск при сбое,
  • User — под каким пользователем запускать,
  • Environment — переменные окружения,
  • WantedBy=multi-user.target — юнит будет активен в обычном многопользовательском режиме.

Systemctl - команды

Основной инструмент взаимодействия с Systemd — это утилита systemctl. Ниже представленые основные команды, которые могут быть полезны в работе.

Просмотр сервисов

  • systemctl list-units --type=service --all — просмотр всех юнитов сервисов в системе
  • systemctl list-unit-files --type=service — список установленных юнит-файлов сервисов
  • systemctl status <name> — статус юнита и последние логи

Управление сервисами

  • systemctl start <name> — запустить сервис
  • systemctl stop <name> — остановить сервис
  • systemctl restart <name> — перезапустить сервис
  • systemctl try-restart <name> — перезапустить, если сервис уже запущен
  • systemctl reload <name> — перечитать конфигурацию без остановки
  • systemctl daemon-reload — перечитать конфигурации юнитов (после их изменения)

Автозапуск

  • systemctl enable <name> — включить автозапуск
  • systemctl disable <name> — отключить автозапуск
  • systemctl is-enabled <name> — проверить, включён ли автозапуск
  • systemctl preset <name> — сбросить настройки автозапуска к значениям по умолчанию

Проверка статуса

  • systemctl is-active <name> — проверка, запущен ли сервис
  • systemctl is-failed <name> — проверка, завершился ли сервис с ошибкой

Блокировка запуска

  • systemctl mask <name> — запретить запуск сервиса (в том числе вручную)
  • systemctl unmask <name> — разрешить запуск сервиса

Работа с юнитами

  • systemctl cat <name> — показать содержимое юнит-файла
  • systemctl edit <name> — создать кастомный override-файл для юнита
  • systemctl edit --full <name> — отредактировать полный оригинальный юнит-файл
  • systemctl revert <name> — сбросить изменения, сделанные через edit

Режимы системы

  • systemctl rescue — перейти в rescue-режим (минимальный многопользовательский режим)
  • systemctl emergency — перейти в emergency-режим (ещё более минимальный)
  • systemctl default — вернуться к обычному режиму (multi-user или graphical)

Перезагрузка / Завершение работы

  • systemctl reboot — перезагрузить систему
  • systemctl poweroff — выключить систему
  • systemctl halt — остановить систему (без отключения питания)
  • systemctl suspend — перевести в спящий режим
  • systemctl hibernate — перевести в гибернацию

Заключение

Systemd стал стандартом в большинстве современных дистрибутивов Linux, и умение работать с ним — необходимый навык для любого системного администратора или DevOps-инженера. Понимание структуры юнит-файлов и уверенное владение systemctl позволяет эффективно управлять службами, автоматизировать задачи и обеспечивать стабильную работу систем.