Как проверить 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

тогда три пути в команде соответствуют:

  1. Каталог, в котором хранятся именованные каналы
  2. Каталог, в который записывается стандартный вывод
  3. Команда для фактического запуска узла 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 для подключения к работающему приложению.

Другие вопросы по тегам