Systemd - это система инициализации и управления сервисами, которая используется в большинстве современных дистрибутивов Linux, включая Ubuntu, Debian, CentOS, RHEL и другие. Она пришла на смену более старым системам инициализации SysV init и Upstart.
Основные возможности systemd:
- Параллельный запуск сервисов при старте системы
- Централизованное управление конфигурацией
- Ведение журнала событий
- Мониторинг сервисов и автоматический перезапуск
- Возможность описания зависимостей между сервисами
Systemd использует для конфигурирования специальные файлы - юниты (unit files). Юнит - это конфигурационный файл в формате ini, который описывает некоторый объект для управления в systemd.
Основные типы юнитов:
- Service - сервисы, демоны
- Target - группы юнитов
- Timer - таймеры для периодического запуска
- Mount - монтирование файловых систем
- Socket - сетевые сокеты
- Path - мониторинг путей в файловой системе
Для описания логики запуска сервисов используются целевые юниты (target units). Они позволяют группировать юниты по определенному сценарию запуска.
Например, multi-user.target обеспечивает запуск всех сервисов для многопользовательского режима работы, а graphical.target - для графического режима с юнитами отображения GUI.
При старте системы активируется целевой юнит default.target, который определяет сценарий запуска по умолчанию.
Для автозапуска приложения в systemd нужно:
1. Создать юнит для приложения
2. Настроить автозапуск юнита при загрузке системы
Рассмотрим эти шаги подробнее.
Создание юнита для приложения
Для описания сервиса используется юнит типа Service. Он содержит разделы:
[Unit] - общие параметры юнита
[Service] - настройки сервиса
[Install] - опции для установки
Пример юнита /etc/systemd/system/myapp.service:
[Unit]
Description=My Custom App
[Service]
Type=simple
ExecStart=/opt/myapp/bin/myapp --option1 --option2
Restart=on-failure
User=myappuser
[Install]
WantedBy=multi-user.target
Здесь описан простой сервис для запуска скрипта myapp с аргументами. Параметры:
- ExecStart - команда запуска
- User - пользователь
- Restart - перезапуск при сбое
- WantedBy - автозапуск при multi-user.target
Более сложная настройка может включать:
- Описание нескольких команд ExecStartPre, ExecStart, ExecStop
- Настройку параметров окружения, путей, приоритетов
- Указание зависимостей между юнитами
- Таймеры запуска и остановки
Настройка автозапуска
Чтобы сервис запускался автоматически при загрузке системы, нужно:
1. Указать желаемый целевой юнит в параметре WantedBy, например multi-user.target
2. Включить юнит командой:
# systemctl enable myapp.service
Это создаст символьную ссылку на него в каталоге /etc/systemd/system/ соответствующего целевого юнита.
После внесения изменений в юниты необходимо уведомить systemd:
# systemctl daemon-reload
Это перечитает все конфиги юнитов. Теперь можно запустить нужный юнит вручную:
# systemctl start myapp.service
Или проверить его выполнение:
# systemctl status myapp.service
Дополнительные возможности
- Возможность описания сложных зависимостей между юнитами через Wants, Requires, Before, After
- Маскирование юнитов - запрет автозапуска
- Статические и динамические юниты для временных сервисов
- Генерация юнитов через генераторы юнитов
- Расширенные опции мониторинга и восстановления сервисов
Таким образом, systemd предоставляет очень гибкие возможности для настройки автозапуска приложений и сервисов в Linux. Используя юниты systemd, можно полностью контролировать процесс инициализации системы и поведение сервисов при различных событиях.