Как проверить DETS на живом приложении?
Я новичок в Erlang, но мне было интересно, можно ли каким-либо образом подключиться к работающему приложению и изучить ETS или DETS, которые оно использует. Если да, не могли бы вы привести небольшой пример?
Спасибо!
2 ответа
Есть два способа сделать это, оба из которых могут работать или не работать в зависимости от того, как был запущен узел Erlang:
- с помощью
to_erl
- открытие удаленной оболочки (
erl -remsh
) по распределению Эрланга
В любом случае, вы получаете оболочку Erlang, где вы можете проверять свои таблицы.
run_erl и to_erl
Если узел Erlang был запущен с run_erl
обертка, то вы можете подключиться к работающему узлу с to_erl
, Вы можете увидеть run_erl
команда, используемая при запуске:
ps -C run_erl -fww
Например, если узел Erlang был запущен с этой командой:
run_erl -daemon /my/erlang/node/tmp/ /my/erlang/node/log/ /my/erlang/node/start
тогда три пути в команде соответствуют:
- Каталог, в котором хранятся именованные каналы
- Каталог, в который записывается стандартный вывод
- Команда для фактического запуска узла Erlang
Вы хотите первый для to_erl
так что команда будет:
to_erl /my/erlang/node/tmp/
Обратите внимание на косую черту! to_erl
запутывается, если его не хватает.
Для выхода наберите Ctrl-D
,
Подключитесь с помощью дистрибутива Erlang
Если узел Erlang работает как распределенный узел, и вы знаете секретный файл "cookie", вы можете запустить другой узел и открыть удаленную оболочку.
Какое имя узла? Длинный или короткий?
Вам необходимо знать имя узла запущенного узла, а также, работает ли он с "длинными" или "короткими" именами узлов.
В "длинном" имени узла часть узла - это полное доменное имя или IP-адрес, но в "коротком" имени узла часть узла - это просто имя узла без точек. Если узел Erlang был запущен с -name
вариант, он использует длинные имена узлов, и если он был запущен с -sname
вариант, он использует короткие имена узлов. Если ни одна из опций не использовалась, это не распределенный узел, и к нему невозможно подключиться. 1
И имя хоста может быть явным или неявным в команде. Если команда выглядит следующим образом, вы уже знаете точное имя узла:
erl -name myerlangnode@mymachine.example.com
erl -sname myerlangnode@mymachine
Но если -name
или же -sname
Опция указывает только "пустое" имя узла, вам нужно выяснить, с какого имени хоста он выбрал, чтобы начать:
erl -name myerlangnode # node name is actually myerlangnode@mymachine.example.com
erl -sname myerlangnode # node name is actually myerlangnode@mymachine
Что такое печенье?
Когда один узел Erlang соединяется с другим, на обоих узлах должен быть настроен один и тот же "cookie", иначе рукопожатие не будет выполнено. Файл cookie может быть прочитан из файла. .erlang.cookie
в домашнем каталоге пользователя, на котором запущен узел Erlang, или заданный явно с помощью -setcookie
команда при запуске узла.
Давайте соединяться!
Итак, теперь мы знаем:
- точное имя узла, используемое запущенным узлом
- был ли узел запущен с
-name
или же-sname
(т.е. длинное или короткое имя узла) - был ли файл cookie прочитан из домашнего каталога пользователя или установлен с помощью
-setcookie
Теперь мы можем подключиться! Нам нужно запустить временный узел Erlang, который:
- использования
-name
или же-sname
в соответствии с чем запущенный узел был запущен - использует уникальное имя узла
- либо использует то же самое
-setcookie
опция в качестве запущенного узла или запускается от имени того же пользователя для доступа к тому же.erlang.cookie
файл - использования
-remsh
("удаленная оболочка") для подключения к работающему узлу. - использования
-hidden
чтобы не быть замеченным как часть кластера Erlang
Так что-то вроде этого:
erl -hidden -name mytmpnode -setcookie secret -remsh myerlangnode@mymachine.example.com
erl -hidden -sname mytmpnode -setcookie secret -remsh myerlangnode@mymachine
Это должно открыть оболочку на работающем узле. Вы можете сказать, посмотрев на приглашение, в котором должно быть указано имя узла:
(myerlangnode@mymachine)1>
Если он не показывает правильное имя узла, см. Вопрос: " Не работает удаленная оболочка Erlang".
Для выхода наберите Ctrl-g
а потом q
,
Изучите таблицы ETS или DETS
Получив оболочку Erlang, вы можете осмотреть столы. использование ets:all()
или же dets:all()
перечислить существующие таблицы. Для ETS вы можете использовать ets:tab2list
, который показывает все записи в таблице:
ets:tab2list(my_table).
Для DETS вы можете использовать dets:match_object
с '_'
шаблон подстановки:
dets:match_object(my_table, '_').
1 За исключением случаев, когда узел был запущен как нераспределенный узел, а затем превратился в распределенный узел с net_kernel:start
,
Вы можете использовать Observer для просмотра таблиц ETS, если у вас есть доступ к ним. Из эрланга просто наберите observer:start().
открыть графический интерфейс.
Чтобы подключиться к работающему именованному узлу, вы используете опцию подключения к удаленному узлу в Erlang Shell.
Начать именованный узел
$erl -name application@hostname
С другой машины или терминала запустите новую оболочку erlang
$erl -name temp@hostname
Из вашей временной оболочки erlang подключитесь к приложению, нажав Ctrl + g, а затем h
или же ?
чтобы получить список вариантов. вариант r
это подключиться к удаленному узлу и c
подключиться к новой работе.
>r 'application@hostname'
>c
После этого вы можете вызывать любые команды, как если бы вы находились на этом компьютере, вызывать любой модуль: функции и получать доступ к таблицам ETS.
Если вы находитесь на одном компьютере, больше ничего нет, если вы находитесь на разных компьютерах, вы должны установить cookie-файлы так, чтобы они совпадали, иначе вы не сможете подключиться.
Будьте осторожны при отключении, вы должны переключиться на свой локальный узел перед выходом или уничтожением временного приложения, а не уничтожать реальное приложение.
Rebar3
Многие люди используют Rebar3 для создания и запуска проектов Erlang в наши дни, если вы этого не сделаете, я настоятельно рекомендую использовать его.
С Rebar3 вы запускаете приложение с помощью команды запуска и с помощью команды присоединения присоединяетесь к работающему приложению. Вы должны сделать релиз с Rebar3, чтобы использовать эти команды. Больше информации здесь.
образец:
rel/my_app/bin/my_app start
rel/my_app/bin/my_app attach
после этого сделайте, как указано выше, чтобы получить доступ к ETS или используйте любую команду ets, указанную на man-страницах erlang.
Используйте Ctrl+D, чтобы отделить.
Mix and Match Вы можете подключиться к проекту, начатому с rebar3, используя обычный erl -name temp@hostname
ракушка. Пока файлы cookie совпадают и вы знаете имя узла, вам не нужно использовать Rebar3 для подключения к работающему приложению.