Как остановить все единицы, принадлежащие одной и той же цели?

Мне интересно, как остановить все единицы, которые сгруппированы вместе одной и той же целью.

Моя настройка выглядит следующим образом. У меня есть несколько конфигурационных файлов, которые читаются:

[Unit] ... [Service] ... [Install] WantedBy=mycustom.target 

Когда я бегу

 # systemctl start mycustom.target 

Те единицы, которые «хотят» mycustom.target начинают правильно. Теперь я также хотел бы остановить все юниты, которые хотели получить mycustom.target . Я пытался:

 # systemctl stop mycustom.target 

Это ничего не делает. Есть ли способ сделать эту работу без необходимости останавливать все единицы, которые (явно) нужны той же цели?

Есть два пути: неявный и явный.

Первый путь – StopWhenUnneeded=

Первый способ – использовать директиву StopWhenUnneeded= . Если у блока есть StopWhenUnneeded=yes , он будет автоматически остановлен, когда не будет активного блока, который Wants= / Requires= рассматриваемая единица. Следовательно:

  • это будет работать, только если эти единицы WantedBy= только mycustom.target ;
  • вы не сможете запустить какое-либо из этих устройств вручную (то есть systemctl start myunit.service запустит его и сразу же остановит его).

Второй путь – трубопровод

Второй способ – создать простой конвейер оболочки, используя systemctl show -p чтобы извлечь список зависимостей mycustom.target .

Более конкретно, systemctl show UNIT покажет все свойства единицы в форме KEY = VALUE, а systemctl show -p PROPERTIES UNIT будет делать то же самое, ограничивая набор отображаемых свойств. Так:

 systemctl stop -- $(systemctl show -p Wants mycustom.target | cut -d= -f2) 

Используйте директиву PartOf= .

Настраивает зависимости, аналогичные Requires =, но ограничивается остановкой и перезапуском блоков. Когда systemd останавливает или перезапускает перечисленные здесь единицы, действие распространяется на этот блок. Обратите внимание, что это односторонняя зависимость. Изменения в этом устройстве не влияют на перечисленные единицы.

PartOf=mycustom.target