Перезапуск службы Systemd Unit при запуске или перезагрузке другой службы

Нет необходимости во вложении:

mkdir -p backup/{daily,weekly,monthly}/{directories,databases,logs}
16
26.11.2016, 15:40
3 ответа

Вы можете использовать PartOf в разделе [Unit] .

Пример: PartOf = B.service

Из справочной страницы,

PartOf =

Настраивает зависимости аналогично Requires =, но ограничивается остановкой и перезапуском модулей. Когда systemd останавливает или перезапускает перечисленные здесь модули , действие распространяется на это устройство. Обратите внимание, что это односторонняя зависимость - изменения этого блока не влияют на перечисленные блоки.

19
27.01.2020, 19:48

Я не мог контролировать стоп с PartOf = , а A не должен остановитесь на B , поэтому в итоге я использовал Переопределение настроек поставщика , похоже, работает.

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/ cmd реализация асинхронна и имеет доступ к ресурсу, к которому /script.sh также требуется доступ, Я не нашел ничего лучше (пока), чтобы поспать несколько секунд.

Я пробовал использовать systemctl [--no-block] try-restart перед непосредственным использованием /script.sh , но это не сработало.

4
27.01.2020, 19:48

На данный момент systemd не охватывает этот вариант. Вы не можете достичь этой функциональности только с помощью служебных файлов. Одна из возможностей - захватить systemctl с помощью сценария оболочки с тем же именем и в этой проверке, чтобы увидеть, будет ли B.service перезапущен / запущен или перезагружен, также выполнить соответствующее действие с A.service и, при необходимости, обновить rc.local, чтобы также перейти в правильное состояние при загрузке. У меня проблема с docker.service и network.service, но я просто всегда перезапускаю их вместе:

systemctl restart docker.service network.service

Очевидно, это не будет эффективно, если systemd сама будет управлять B.service изнутри. (например, через другие служебные файлы.).

2
27.01.2020, 19:48

Теги

Похожие вопросы