Как кодировать загрузочные модули на всех узлах в Distributed Erlang?

Я изучаю Erlang/OTP, и в главе 14 говорится:

«Вы можете загрузить модуль на все узлы, используя команду оболочки: command nl(Mod)».

Я хочу знать, как это сделать? Я не могу найти команду оболочки: command nl(Mod).


person Chinaxing    schedule 19.02.2015    source источник


Ответы (1)


Вы пытались набрать help(). в оболочке? Эта функция определена в модуле c. в стандартной библиотеке. Но шелл поймет nl(Mod).

Для выполнения теста запустите как минимум две виртуальные машины erlang и подключите их:

erl -pa your_module_path -name [email protected]
erl -name [email protected]

в первой оболочке подключитесь ко второму узлу:

net_kernel:connect('[email protected]').

должен ответить true.

В your_module_path создайте простой модуль, например:

-module(nl_test).
-export([test/0]).
test() -> 1.

и скомпилировать его с помощью c(nl_test). Теперь вы можете запустить nl_test:test() из первой оболочки, но вторая не может ее загрузить. Чтобы транслировать его и принудительно загрузить, просто запустите из первого nl(nl_test). Теперь попробуйте из второго шелла nl_test:test().

Допустим, вы изменили test() -> 1. на test() -> 2., и все, что вам нужно сделать, это просто запустить c(nl_test), nl(nl_test). или короче nc(nl_test), что означает то же самое.

nl_test:test(). на всех ваших подключенных узлах должно возвращать 2.

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

person Łukasz Ptaszyński    schedule 19.02.2015