Как запустить новый добавленный супервизор, не перезагружая сервер в erlang?
У нас есть сервер, работающий на удаленном узле. Теперь мы хотим добавить новую функцию (реализованную gen_*) без остановки сервера. Поэтому я использую rpc:call(Node, my_sup, start_link, []) для запуска супервизора. Но, к сожалению, я обнаружил, что супервизор связан с моей локальной оболочкой, а не с удаленным узлом, и он сразу же вышел из строя (процесс sup был убит) после вызова rpc:.
Мне просто интересно, есть ли другие способы динамически и удаленно запустить новый добавленный супервизор?
1 ответ
Супервайзеры всегда должны быть связаны с чем-то. Обычно OTP-приложение в своем start
Метод порождает "супервизор корня", который контролирует все другие процессы и других супервизоров. Это связано с процессом запуска приложения.
Если у вас есть такой супервизор root, вы можете использовать supervisor:start_child(SupRef, ChildSpec)
, SupRef
является ссылкой на "корневой супервизор" (это может быть Pid или имя) и ChildSpec
будет супервизором, вы хотите порождать или сам gen_server. Эта функция задокументирована здесь:
http://www.erlang.org/doc/man/supervisor.html
Если у вас нет дерева наблюдения. Вы можете упаковать новую функцию как приложение OTP, которое порождает первого супервизора при запуске.