8 hours ago
О, великий systemd
Systemd — это современная система инициализации и управления службами в Linux. Она использует unit-файлы (юниты) для описания сервисов, таймеров, сокетов и других сущностей.
Где лежат systemd-Юниты:
/lib/systemd/system//usr/lib/systemd/user//usr/lib/systemd/system/(повторение)- Самый часто используемый -
/etc/systemd/system/, в который мы будем добавлять свои.
Типы юнитов systemd
- target — группирует сервисы в группы, аналогично понятию
runlevel. - service — отвечает за запуск сервисов и поддерживает вызов интерпретаторов для исполнения пользовательских скриптов.
- mount — занимается монтированием файловых систем.
- automount — автоматическое挂载, используется при обращении к точке montariруания.
- swap — отвечает за подключение файла подкачки.
- timer — запускает модули по расписанию, аналогично cron.
- socket — запуск модуля при подключении к сокету.
- slice — группировка других модулей в контейнере (дерево) cgroups.
- device — использует реакцию на подключение какого-либо устройства.
- path — запуск модуля по событию доступа по конкретному пути в файловой системе.
После изменения unit-файлов обязательно выполнять:
sudo systemctl daemon-reload
Структура unit-файла
Файл имеет формат INI (секции в квадратных скобках). Основные секции:
- [Unit] — общее описание и зависимости.
Description— краткое описание сервисаAfter,Before— порядок запуска относительно других юнитовRequires— жёсткая зависимость (если зависимый юнит падает, текущий тоже останавливается)Wants— мягкая зависимость (сервис попытается запуститься, даже если зависимость не работает)Conflicts— запрещает совместный запуск с другим юнитом
Пример:
[Unit]
Description=Мой веб-сервер
After=network.target postgresql.service
Wants=postgresql.service
- [Service] — настройки сервиса.
Type— тип сервиса:simple(по умолчанию) — systemd считает сервис запущенным сразу после ExecStart.forking— для демонов, которые форкаются (нужен PIDFile).oneshot— сервис завершается после выполнения команды (полезно для скриптов).notify— сервис уведомляет systemd о готовности (через sd_notify)
ExecStart,ExecStop,Restart,User,Group,WorkingDirectory,Environment
Пример:
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/myapp/server.py
User=myapp
Group=myapp
Restart=on-failure
Environment="PORT=8080"
- [Install] — настройки для systemctl enable.
WantedBy— в какой target добавить сервис (например, multi-user.target).RequiredBy— аналогично, но с жёсткой зависимостью
Пример:
[Install]
WantedBy=multi-user.target
Примеры
Пример 1: Простой сервис (Python-скрипт)
/etc/systemd/system/myapp.service:
[Unit]
Description=Мой Python-сервис
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/myapp/main.py
WorkingDirectory=/opt/myapp
User=appuser
Restart=on-failure
[Install]
WantedBy=multi-user.target
Пример 2: Демон с PID-файлом (forking)
[Service]
Type=forking
ExecStart=/usr/local/bin/mydaemon --pid-file=/run/mydaemon.pid
PIDFile=/run/mydaemon.pid
Restart=always
Пример 3: Таймер (аналог cron)
Файл /etc/systemd/system/backup.timer:
[Unit]
Description=Ежедневное резервное копирование
[Timer]
OnCalendar=daily
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
Файл /etc/systemd/system/backup.service:
[Unit]
Description=Backup Script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Запуск и управление сервисами
- Просмотр всех юнитов:
systemctl list-units --type=service --all - Запустить сервис:
systemctl start name - Остановить сервис:
systemctl stop name - Перезапустить сервис:
systemctl restart name - Статус сервиса:
systemctl status name - Перечитать конфигурацию:
systemctl reload name - Загрузить новую конфигурацию для всех unit-файлов:
systemctl daemon-reload - Перезапустить сервис, если он запущен:
systemctl try-restart name - Включить автозапуск сервиса:
systemctl enable name - Отключить автозапуск сервиса:
systemctl disable name - Список установленных юнит-файлов сервисов:
systemctl list-unit-files --type service - Список зависимостей сервиса:
systemctl list-dependencies