Вопрос или проблема
Я пытаюсь запустить службу systemd при завершении работы: она вроде бы работает (вызов выполняется), но запускается после размонтирования файловых систем, что мне не нужно. Поэтому я попробовал с Before=umount.target
и WantedBy=umount.target
, но безуспешно (файловые системы размонтируются до запуска службы). Когда я говорю “файловые системы”, я имею в виду все, кроме корневого.
Есть ли какие-нибудь другие цели, которые следует учесть?
Попробуйте добавить DefaultDependencies=no
в раздел Unit файла службы.
systemd.service manpage говорит:
Следующие зависимости добавляются, если не установлено DefaultDependencies=no:
• Для единиц служб добавляются зависимости типа Requires= и After= на sysinit.target, зависимость типа After= на basic.target, а также зависимости типа Conflicts= и Before= на shutdown.target. Эти зависимости обеспечивают, что нормальные единицы служб подтягивают инициализацию основной системы и завершаются корректно перед завершением работы системы. Только службы, участвующие в ранней загрузке или позднем завершении работы системы, должны отключать эту опцию.
…
Ответ или решение
Вопрос о запуске systemd-сервиса до демонтажа файловых систем на этапе завершения работы системы часто возникает у системных администраторов, стремящихся обеспечить выполнение определённых задач перед тем, как файлы становятся недоступными. Чтобы решить эту проблему, необходимо правильно настроить сервис в systemd, принимая во внимание его зависимость от других целевых блоков (targets) и этапов завершения работы системы.
Теория
Система инициализации systemd управляет зависимостями и порядком запуска/остановки сервисов и компонентов системы с помощью целей (targets) и юнитов (units). Когда вам нужно гарантировать, что сервис будет запущен до демонтажа файловых систем, следует учесть:
-
Целевые блоки (Targets):
- umount.target: используется в тех случаях, когда необходимо указать демонтаж файловых систем. Задание
Before=umount.target
иWantedBy=umount.target
может работать не так, как ожидается, если другие зависимости не учтены. - shutdown.target: он используется в процессе завершения работы всех сервисов перед завершением работы системы.
- umount.target: используется в тех случаях, когда необходимо указать демонтаж файловых систем. Задание
-
Опция DefaultDependencies:
DefaultDependencies=no
: отключение зависимостей по умолчанию позволяет вам вручную управлять порядком выполнения юнитов, но также требует понимания всех связанных процессов и этапов инициализации и завершения работы системы.
-
Типы зависимостей:
- After=: гарантирует, что юнит будет запущен после указанных юнитов.
- Before=: гарантирует, что юнит будет запущен до указанных юнитов.
- Requires= и Wants=: создают обязательные и необязательные зависимости соответственно, которые подтягивают другие юниты при активации.
Пример
Рассмотрим пример юнита systemd, который должен быть запущен перед демонтажем файловых систем, но после завершения работы всех необходимых сервисов. Это может быть необходимо для резервного копирования данных или вывода журнала.
[Unit]
Description=Custom Shutdown Service
DefaultDependencies=no
Before=umount.target shutdown.target
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/custom-script.sh
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
- DefaultDependencies=no: отключает зависимости по умолчанию, позволяя более гибко управлять моментом активации сервиса.
- Before=umount.target shutdown.target: гарантирует, что наш сервис выполнился до начала демонтажа.
- After=network.target: делает так, чтобы сервис ожидал завершение работы сетевых служб, если они необходимы для его выполнения.
- WantedBy=shutdown.target: автоматически активирует наш юнит на этапе завершения системы.
Применение
-
Создание и активация:
- Сохраните этот юнит в файле
/etc/systemd/system/custom-shutdown.service
. - Выполните команду
systemctl daemon-reload
, чтобы обновить конфигурации systemd. - Активируйте юнит командой
systemctl enable custom-shutdown.service
.
- Сохраните этот юнит в файле
-
Проверка работы:
- Инициализируйте завершение работы системы и мониторьте логи с помощью
journalctl
для проверки порядка выполнения.
- Инициализируйте завершение работы системы и мониторьте логи с помощью
-
Отладка:
- Если сервис не запускается в должный момент, проверьте логики зависимостей: возможно, другие юниты (например, network.target) не завершили работу.
Таким образом, правильная настройка systemd-сервиса перед демонтажем файловых систем требует внимания к зависимостям и последовательности выполнения. Использование таких опций, как DefaultDependencies=no
, позволяет более детально управлять этим процессом, гарантируя выполнение необходимых операций до момента, когда системы загрузки и настройки завершат свою работу, и файлы стали недоступными.