当我的遥控器是嵌入式系统时,如何使用 IEx 的 :observer?
How can I use :observer from IEx when my remote is an embedded system?
我想从远程 IEx 演示 :observer GUI 的使用 shell。我的目标是 BEAM 运行 我在资源受限的嵌入式系统上的 Elixir 应用程序。
我使用 Buildroot 构建了远程 OS,包括对 Erlang 的支持。我添加了 elixir-lang 回购的结帐以给我 Elixir 和 IEx。 (版本报告为 1.13.0-dev,我使用的是 Erlang/OTP 22。)
我的主机 OS 是 Ubuntu,为了保持一致性,我使用相同版本的 Elixir 和 OTP。
我在远程机器上启动我的应用程序:
iex --sname foo --cookie <cookie> -S mix run
并从我的主机连接到它:
iex --sname bar --cookie <cookie> --remsh foo@<remote machine name>
这给了我一个遥控器 shell。但是,当我尝试输入 :observer.start()
时,出现错误 ERROR: Could not find 'wxe_driver.so' in: /usr/lib/erlang/lib/wx-1.9/priv
.so 文件实际上存在于我的 Ubuntu 机器上的该路径中,但不存在于缺少 WX 小部件(以及 X windows 和任何类型的图形输出硬件)的嵌入式系统中。有没有办法解决?我是不是做错了什么?
问题出在 --remsh
。使用 --remsh
将打开一个远程会话,就像您以与典型 SSH 会话类似的方式从该机器执行 IEx 一样。
您需要使用 Node.connect/1
从本地 IEx 会话连接到远程节点,然后打开观察器 :observer.start()
。这将需要通过 SSH 访问远程机器(您的嵌入式系统)并将两个端口从该系统转发到您的本地主机。
第一个端口来自 epmd
- Erlang 端口管理器守护进程 - 第二个端口来自您系统的节点。
- 运行
epmd -names
在您的嵌入式系统上获取两个端口。
之后确保 epmd
不是 运行 在您的本地主机上(ps aux | grep epmd
如果是 运行 则杀死它)。它应该 运行 仅在您的嵌入式系统上。
将两个端口转发到您的本地主机:
$ ssh user@remote-embedded -L4369:localhost:4369 -L41437:localhost:41437
再次在本地主机上启动一个新的 IEx 会话(没有 --remsh
):
$ iex -name bar@127.0.0.1 --cookie mycookie
从此 IEx 会话连接到远程系统:
> Node.connect(:"foo@127.0.0.1")
这应该returntrue
。请注意,我使用的是长名称(-name
而不是像您所做的 -sname
),但短名称也应该有效。
终于打开观察者了:
> :observer.start()
Select 来自“节点”菜单的远程系统。
之所以可行,是因为 Observer 对远程计算机运行了多个 RPC 调用,以便从该系统获取数据。这样您就不需要在嵌入式系统上安装任何“图形”。
要了解更多信息,请参阅 http://blog.plataformatec.com.br/2016/05/tracing-and-observing-your-remote-node/
我想从远程 IEx 演示 :observer GUI 的使用 shell。我的目标是 BEAM 运行 我在资源受限的嵌入式系统上的 Elixir 应用程序。
我使用 Buildroot 构建了远程 OS,包括对 Erlang 的支持。我添加了 elixir-lang 回购的结帐以给我 Elixir 和 IEx。 (版本报告为 1.13.0-dev,我使用的是 Erlang/OTP 22。)
我的主机 OS 是 Ubuntu,为了保持一致性,我使用相同版本的 Elixir 和 OTP。
我在远程机器上启动我的应用程序:
iex --sname foo --cookie <cookie> -S mix run
并从我的主机连接到它:
iex --sname bar --cookie <cookie> --remsh foo@<remote machine name>
这给了我一个遥控器 shell。但是,当我尝试输入 :observer.start()
时,出现错误 ERROR: Could not find 'wxe_driver.so' in: /usr/lib/erlang/lib/wx-1.9/priv
.so 文件实际上存在于我的 Ubuntu 机器上的该路径中,但不存在于缺少 WX 小部件(以及 X windows 和任何类型的图形输出硬件)的嵌入式系统中。有没有办法解决?我是不是做错了什么?
问题出在 --remsh
。使用 --remsh
将打开一个远程会话,就像您以与典型 SSH 会话类似的方式从该机器执行 IEx 一样。
您需要使用 Node.connect/1
从本地 IEx 会话连接到远程节点,然后打开观察器 :observer.start()
。这将需要通过 SSH 访问远程机器(您的嵌入式系统)并将两个端口从该系统转发到您的本地主机。
第一个端口来自 epmd
- Erlang 端口管理器守护进程 - 第二个端口来自您系统的节点。
- 运行
epmd -names
在您的嵌入式系统上获取两个端口。
之后确保
epmd
不是 运行 在您的本地主机上(ps aux | grep epmd
如果是 运行 则杀死它)。它应该 运行 仅在您的嵌入式系统上。将两个端口转发到您的本地主机:
$ ssh user@remote-embedded -L4369:localhost:4369 -L41437:localhost:41437
再次在本地主机上启动一个新的 IEx 会话(没有
--remsh
):$ iex -name bar@127.0.0.1 --cookie mycookie
从此 IEx 会话连接到远程系统:
> Node.connect(:"foo@127.0.0.1")
这应该return
true
。请注意,我使用的是长名称(-name
而不是像您所做的-sname
),但短名称也应该有效。终于打开观察者了:
> :observer.start()
Select 来自“节点”菜单的远程系统。
之所以可行,是因为 Observer 对远程计算机运行了多个 RPC 调用,以便从该系统获取数据。这样您就不需要在嵌入式系统上安装任何“图形”。
要了解更多信息,请参阅 http://blog.plataformatec.com.br/2016/05/tracing-and-observing-your-remote-node/