Нет необходимости во вложении:
mkdir -p backup/{daily,weekly,monthly}/{directories,databases,logs}
Вы можете использовать PartOf
в разделе [Unit]
.
Пример: PartOf = B.service
Из справочной страницы,
PartOf =
Настраивает зависимости аналогично Requires =, но ограничивается остановкой и перезапуском модулей. Когда systemd останавливает или перезапускает перечисленные здесь модули , действие распространяется на это устройство. Обратите внимание, что это односторонняя зависимость - изменения этого блока не влияют на перечисленные блоки.
Я не мог контролировать стоп
с 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
, но это не сработало.
На данный момент systemd не охватывает этот вариант. Вы не можете достичь этой функциональности только с помощью служебных файлов. Одна из возможностей - захватить systemctl с помощью сценария оболочки с тем же именем и в этой проверке, чтобы увидеть, будет ли B.service перезапущен / запущен или перезагружен, также выполнить соответствующее действие с A.service и, при необходимости, обновить rc.local, чтобы также перейти в правильное состояние при загрузке. У меня проблема с docker.service и network.service, но я просто всегда перезапускаю их вместе:
systemctl restart docker.service network.service
Очевидно, это не будет эффективно, если systemd сама будет управлять B.service изнутри. (например, через другие служебные файлы.).