Просто вызовите его в асинхронной задаче Task.async(fn -> Process.exit(Sup1, :shutdown) end)
, он остановит Sup1, и с ним все дети отключатся
EDIT:
Если вам нужно более красивое решение, это зависит от того, что еще вам нужно. В большинстве случаев я создаю рабочий Bootstrapper, который будет выполнять инициализацию и некоторые другие вещи. Вы можете легко добавить другие функции.
Итак, учитывая вышеизложенное и, грубо говоря, я бы добавил в слой выше (AppSupervisor
) еще один DynamicSupervisor, чтобы он мог запустить Bootstrapper и передать ему self()
(или зарегистрировать его под локальным именем, чтобы избежать этой инъекции ). После этого при запуске рабочий Bootstrap запустит Sup1 (ваш динамический супервизор) и будет ожидать других сообщений, например, :terminate_sup1
, который остановит Sup1
процесс. Позже, у некоторых из нижеперечисленных работников вы можете отключить Sup1
, передав сообщение :terminate_sup1
загрузчику. Также есть дверь, которая позволяет вам снова запускать Sup1 при отправке другого сообщения работнику начальной загрузки.
Более того, если вам просто нужно отключить Sup1, просто перейдите к Задаче. Но если вам нужен контроль, поместите его в один рабочий процесс, который должен контролировать его, когда он включен или выключен.