У меня есть две службы A.service и B.service. Я хочу, чтобы B был остановлен, когда A выходит / погибает / останавливается. Кроме того, я хочу, чтобы B перезапустился при перезапуске A. Я попробовал ответ, данный в Как запустить и остановить один модуль systemd другим? и установите мои файлы следующим образом: -
Услуга
[Unit]
Description=A
Before=B.service
Requires=B.service
[Service]
ExecStart=/usr/share/A
ExecStopPost=/usr/evo/exit_handler.sh %p
Restart=always
StartLimitBurst=3
StartLimitInterval=300
Б. сервис
[Unit]
Description=B
BindsTo=A.service
[Service]
Type=forking
ExecStart=/usr/share/B start
ExecStop=/usr/share/B stop
StartLimitBurst=5
StartLimitInterval=10
Restart=always
Когда я убиваю A или перезапускаю systemctl A, я вижу, что B перезапускается. Но когда A выходит со статусом 0, я не вижу перезапуска B. Я включил вход в систему отладки systemd и вижу, что состояние A меняется на мертвое, но не на автоматический перезапуск
Ваш блок B использует BindsTo=
, который предназначен для отслеживания состояния объекта, который может исчезнуть.
То, что ты хочешь вместо из этого PartOf=
, где этот сервис будет точно отслеживать статус названного сервиса. Из документация:
PartOf=
Настраивает зависимости аналогичноRequires=
, но ограничивается остановкой и перезапуском модулей. Когда systemd останавливает или перезапускает перечисленные здесь модули, действие распространяется на это устройство. Обратите внимание, что это односторонняя зависимость - изменения этого модуля не влияют на перечисленные единицы.
Я не думаю, что это исправит все но твои проблемы. Я подозреваю, что вы недостаточно внимательно рассмотрели фактические зависимости между двумя вашими службами, и вам нужно будет еще подумать (и уметь выразить себя), прежде чем вы сможете заставить эти модули делать то, что им нужно.