我是Erlang的新手,但我想知道是否有可能以某种方式附加到正在运行的应用程序并检查它正在使用的ETS或DETS。如果是的话,你愿意举一个小例子吗?
谢谢!
答案 0 :(得分:4)
有两种方法可以执行此操作,根据Erlang节点的启动方式,这两种方式都可能有效或无效:
to_erl
erl -remsh
)无论哪种方式,你都会得到一个Erlang shell,你可以在那里检查你的表。
如果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
然后命令中的三个路径对应于:
你想要to_erl
的第一个,所以命令是:
to_erl /my/erlang/node/tmp/
注意尾随斜线!如果遗漏,to_erl
会感到困惑。
要退出,请输入Ctrl-D
。
如果Erlang节点作为分布式节点运行,并且您知道密码" cookie",则可以启动另一个节点并打开远程shell。
您需要知道正在运行的节点的节点名称,以及它是否与" long"一起运行。或"短"节点名称。
在" long"节点名称,主机部分是完全限定的域名或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"配置,否则握手将失败。可以从运行Erlang节点的用户的主目录中的文件.erlang.cookie
读取cookie,也可以在启动节点时使用-setcookie
命令显式设置cookie。
现在我们知道了:
-name
还是-sname
启动的(即长节点名称还是短节点名称)-setcookie
现在我们可以联系了!我们需要启动一个临时的Erlang节点:
-name
或-sname
-setcookie
选项,或以同一用户身份运行以访问相同的.erlang.cookie
文件-remsh
("远程shell")连接到正在运行的节点。-hidden
来避免被视为Erlang群集的一部分这样的事情:
erl -hidden -name mytmpnode -setcookie secret -remsh myerlangnode@mymachine.example.com
erl -hidden -sname mytmpnode -setcookie secret -remsh myerlangnode@mymachine
这应该在运行节点上打开一个shell。您可以通过查看提示来告知,该提示应该告诉您节点名称:
(myerlangnode@mymachine)1>
如果它没有显示正确的节点名称,请参阅问题Erlang remote shell not working。
要退出,请键入Ctrl-g
,然后键入q
。
一旦有了Erlang shell,就可以检查表。使用ets:all()
或dets:all()
列出现有表格。对于ETS,您可以使用ets:tab2list
,它显示表格中的所有条目:
ets:tab2list(my_table).
对于DETS,您可以将dets:match_object
与'_'
通配符模式一起使用:
dets:match_object(my_table, '_').
1 除非节点作为非分布式节点启动,后来变为带有net_kernel:start
的分布式节点。功能
答案 1 :(得分:0)
如果您有权访问ETS表,则可以使用它来查看ETS表。从erlang shell只需输入observer:start().
即可打开GUI。
要连接到正在运行的命名节点,请在Erlang Shell中使用“连接到远程节点”选项。
启动命名节点
$erl -name application@hostname
从另一台机器或终端启动一个新的erlang shell
$erl -name temp@hostname
从临时erlang shell连接到应用程序,按Ctrl + g,然后按h
或?
以获取选项列表。选项r
连接到远程节点,c
连接到新作业。
>r 'application@hostname'
>c
之后,您可以调用任何命令,就像在该计算机上的位置一样,调用任何模块:函数,并访问ETS表。
如果你在同一台机器上没有别的,如果你在不同的机器上,你必须设置cookie才能匹配,否则你将无法连接。
断开连接时要小心,在退出之前必须切换到本地节点,或者终止临时应用程序,不要杀死真正的应用程序。
<强> Rebar3 强>
如今,很多人使用Rebar3来创建和运行Erlang项目,如果你不这样做,我强烈建议你使用它。
使用Rebar3,您可以使用start命令启动应用程序,并使用attach命令附加到正在运行的应用程序。您必须使用Rebar3发布才能使用这些命令。 More info here
示例:
rel/my_app/bin/my_app start
rel/my_app/bin/my_app attach
之后如上所述进行访问ETS或使用erlang man pages中列出的任何ets命令。
使用ctrl + D分离。
混合搭配
您可以使用常规erl -name temp@hostname
shell连接到使用rebar3启动的项目。只要cookie匹配并且您知道节点名称,就不必使用Rebar3连接到正在运行的应用程序。