systemd взаимные эксклюзивные цели с одинаковыми юнитами

Я пытаюсь настроить несколько целей как взаимоисключающие, но содержащие одни и те же единицы.

Пример:

test1.target:

[Unit]
Description=Test 1 target
Wants=multi-user.target
Requires=A.service
Requires=B.service
PropagatesStopTo=A.service B.service
Conflicts=rescue.service rescue.target tests2.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

test2.target:

[Unit]
Description=Test 2 target
Wants=multi-user.target
Requires=A.service
PropagatesStopTo=A.service
Conflicts=rescue.service rescue.target test1.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

В этом случае я хочу иметь возможность запустить test1.target, и когда я запускаю test2.target, systemd должна выйти из test1.target и убить все ненужные процессы.

Пример устройства:

[Unit]
Description=B test unit
StopWhenUnneeded=true

[Service]
ExecStart=/usr/bin/concept/b.sh
Restart=on-failure
RestartSec=1
Type=simple

[Install]
WantedBy=test.target

Так вроде графически:

test1.target запускается: A.service B.service

systemctl start test2.target: останавливает test1.target и B.service

test2.target запускается: ничего, поскольку A.service уже запущен

Моя основная проблема заключается в следующем:

systemctl start test2.target Не удалось запустить test2.target: транзакция содержит конфликтующие задания «стоп» и «запуск» для A.service. Скорее всего, настроены противоречащие друг другу зависимости требований. См. Системные журналы и «systemctl status test2.target» для подробностей.

Если я удалю конфликты из test2.target, test1.target не остановится при запуске test2.target.

Как это можно сделать, если это можно сделать без отправки кода остановки вручную для служб при переходе?

Версия systemd, которую я использую, — 249.3. Так что совсем недавно.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *