Как обеспечить выполнение определенного порядка при остановке определенной службы 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 = на другом блоке, первый останавливается раньше второго, если оба выключены ...