Я пытаюсь настроить несколько целей как взаимоисключающие, но содержащие одни и те же единицы.
Пример:
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. Так что совсем недавно.