我有一个远程Erlang节点和本地开发人员的PC。我想启动本地节点debug@127.0.0.1
,启动观察者,调用c:nl/1
和其他调试操作。我写了这个:
#!/bin/sh
export ERL_EPMD_PORT=43690
PORT=`ssh -l user target -p 5022 "/usr/bin/epmd -names" | awk '$2 == "target-node" {print $5}'`
pkill -f ssh.*-fxN.*target
ssh -fxNL 43690:`hostname`:4369 target -p 5022 -l user
ssh -fxNL $PORT:`hostname`:$PORT target -p 5022 -l user
ssh -fxNR 9001:`hostname`:9001 target -p 5022 -l user
erl -name dev@127.0.0.1 -setcookie ABCDEFFJKGSK \
-kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001 \
-eval "net_adm:ping('nodename@target')."
pkill -f ssh.*-fxN.*target
但是当我运行这个脚本时,我得到的信息如下:
bind:已在使用的地址错误的本地转发规范 ':debian:'Erlang / OTP 17 [erts-6.1] [来源] [64位] [smp:4:4] [async-threads:10] [kernel-poll:false]
Eshell V6.1(以^ G中止)(dev@127.0.0.1)1>
如何在本地计算机上运行observer并将它们连接到远程节点?
答案 0 :(得分:3)
至少有三件事:
如果您关闭进程,该进程与kill
保持TCP连接,则可以进入TIME_WAIT
状态几分钟:read more
在ssh -L port:host:hostport
中,您有2个组件:
port
,这就是说,在我的本地机器上使用此端口host:hostport
表示:"从远程计算机"连接到此主机和端口,您可以想象,您已经在远程计算机上并且您想要连接到第三个您正在使用hostname
内部,在本地计算机上进行评估并返回debian
这是没有意义的,因为可能debian
并不意味着远程机器上的任何东西。尝试使用:
ssh -fxNR 9001:localhost:9001 target -p 5022 -l user
这应该按预期工作,没有关于规范的错误。
Erlang distributed使用节点名来定位计算机。在您调用的本地节点上:
net_adm:ping('nodename@target').
尝试直接在目标上联系端口4369而不进行端口转发。
Erlang distributed旨在用于本地可信网络。通过端口转发进行设置真的很难。
您可以在远程计算机上启动调试节点并连接到您的系统 - 这应该很容易。如果远程系统具有X服务器,您甚至可以转发观察者窗口(ssh -Y
)。
答案 1 :(得分:2)
首先找到远程端口:
$ ssh remote-host "epmd -names"
epmd: up and running on port 4369 with data:
name some_node at port 58769
请注意epmd本身的运行端口以及您要调试的节点的端口。通过转发这些端口重新连接到远程主机:
$ ssh -L 4369:localhost:4369 -L 58769:localhost:58769 remote-host
在您的计算机上,启动一个运行观察者应用程序的隐藏Erlang节点:
$ erl -name debug@127.0.0.1 -setcookie if-server-has-one -hidden -run observer
N.B。:如果服务器使用-sname,您还需要使用-sname,因为Erlang™。出于同样的原因,您还需要更改系统的主机名以匹配目标主机。
在观察者中,转到节点 - 连接节点并输入some_node@127.0.0.1
。
您还可以获得远程shell:
$ erl -name debug@127.0.0.1 -setcookie if-server-has-one -remsh some_node@127.0.0.1
答案 2 :(得分:1)
我尝试自动执行相同的ssh端口转发方法并进入此项目:https://github.com/virtan/ccl
使用添加sys.config
{ccl, [
{slaves, [
{"ef1", "ef1.somehost.net", use}
]}
]}
并启动ccl应用程序以建立到ef1.somehost.net的隧道,并启动并连接远程节点。
答案 3 :(得分:0)
epmd -names
列出的端口转发到localhost,这样我就可以轻松使用本地GUI工具来检查远程节点上的状态。我写了一个shell script automatically forward the ports for me,所以我不必记住一堆命令。它易于使用:
$ ./epmd_port_forwarder --server=remote-erlang-server.net
epmd: Cannot connect to local epmd
Killed local epmd
epmd: up and running on port 4369 with data:
name remote_erlang_node at port 46259
Forwarding ports
+ ssh -N -L 4369:localhost:4369 -L 46259:localhost:46259 remote-erlang-server.net
启动脚本后,您可以使用epmd -names
列出正在转发的远程节点。