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

Запуск и остановка одного модуля systemd с другим

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

Я не думаю, что это исправит все но твои проблемы. Я подозреваю, что вы недостаточно внимательно рассмотрели фактические зависимости между двумя вашими службами, и вам нужно будет еще подумать (и уметь выразить себя), прежде чем вы сможете заставить эти модули делать то, что им нужно.