Назад | Перейти на главную страницу

Как остановить службы systemd в определенном порядке

Как обеспечить выполнение определенного порядка при остановке определенной службы systemd? У меня есть несколько служб / модулей systemd, которые я использую, но использую ресурсы на различных смонтированных разделах. Эти разделы монтируются и размонтируются с помощью специальной службы. Работающие службы (например, ProgramA.service и ProgramB.service) должны быть остановлены в определенном порядке ДО остановки пользовательской программы монтирования.

Настроить зависимости при запуске довольно просто, но я не смог понять, как убедиться, что службы остановлены, прежде чем моя служба монтирования будет остановлена.

mountCustomPartitions.service

[Unit]
Description=My Custom Partition Mounting Service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/mountCustomPartitions.sh mount
ExecStop=/usr/bin/mountCustomPartitions.sh unmount

[Install]
WantedBy=multi-user.target

ProgramA.service

[Unit]
Description=My Generic Program A Service
Wants=mountCustomPartitions.service
After=mountCustomPartitions.service

[Service]
Type=simple
ExecStart=/usr/bin/ProgramA

[Install]
WantedBy=multi-user.target

ProgramB.service

[Unit]
Description=My Generic Program B Service
Requires=ProgramA.service
Wants=mountCustomPartitions.service
After=mountCustomPartitions.service ProgramA.service

[Service]
Type=simple
ExecStart=/usr/bin/ProgramB

[Install]
WantedBy=multi-user.target

В моем сценарии выше, mountCustomPartitions.service должен запускаться до программных служб, но также должен останавливаться после них. Если mountCustomPartitions.service явно остановлен, он должен вызвать остановку и других (но должен дождаться их остановки). Мне также нужно убедиться, что ProgramB запускается после ProgramA, но также останавливается до ProgramA. Надеюсь, это не слишком сбивает с толку.

Единственное решение, которое я могу придумать, - сделать так, чтобы каждая служба имела строку ExecStop, которая выполняет systemctl stop [служба] команда для конкретной службы, которая должна быть остановлена ​​до ее остановки. Проблема в том, что в настоящее время у меня есть шесть служб, которые используют смонтированные разделы, и их необходимо остановить перед попыткой размонтирования. Некоторые из этих шести нужно останавливать в определенном порядке. Поскольку это используется в коммерческом продукте, я надеялся, что есть более чистое решение.

Вы управляете порядком выключения, указав Before= и After= в файлах модуля для описания запускать порядок. При выключении применяется обратный порядок.

Вот что официальные документы надо сказать об этом:

... когда два блока с зависимостью от порядка их включения выключаются, применяется обратный порядку запуска. то есть, если блок настроен с помощью After = на другом блоке, первый останавливается раньше второго, если оба выключены ...