3

我想从远程 IEx shell 演示 :observer GUI 的使用。我的目标是 BEAM 在资源受限的嵌入式系统上运行我的 Elixir 应用程序。

我使用 Buildroot 构建了远程操作系统,包括对 Erlang 的支持。我添加了对 elixir-lang repo 的结帐,以给我 Elixir 和 IEx。(版本报告为 1.13.0-dev,我使用的是 Erlang/OTP 22。)

我的主机操作系统是 Ubuntu,我使用相同版本的 Elixir 和 OTP 以保持一致性。

我在远程机器上启动我的应用程序: iex --sname foo --cookie <cookie> -S mix run 并从我的主机连接到它: iex --sname bar --cookie <cookie> --remsh foo@<remote machine name>

这给了我一个远程外壳。但是,当我尝试输入时:observer.start(),出现错误,ERROR: Could not find 'wxe_driver.so' in: /usr/lib/erlang/lib/wx-1.9/priv

.so 文件实际上存在于我的 Ubuntu 机器上的该路径中,但不存在于缺少 WX 小部件(以及 X 窗口和任何类型的图形输出硬件)的嵌入式系统上。有没有办法解决?我做错了什么吗?

4

1 回答 1

4

问题出在--remsh. 使用--remsh将打开一个远程会话,就像您以与典型 SSH 会话类似的方式从该机器执行 IEx 一样。

您需要使用从本地 IEx 会话连接到远程节点Node.connect/1,然后打开 Observer :observer.start()。这将需要对远程机器(您的嵌入式系统)的 SSH 访问以及从该系统到您的本地主机的两个端口的转发。第一个端口来自epmd- Erlang Port Manager Daemon - 第二个端口来自您系统的节点。

  • 在您的嵌入式系统上运行epmd -names以获取两个端口。

显示两个端口的 epmd 名称

  • 之后确保epmd没有在您的本地主机上运行(ps aux | grep epmd如果它正在运行,则将其杀死)。它应该只在您的嵌入式系统上运行。

  • 将两个端口转发到您的本地主机:

    $ ssh user@remote-embedded -L4369:localhost:4369 -L41437:localhost:41437

  • 再次在 localhost 上启动一个新的 IEx 会话(不带--remsh):

    $ iex -name bar@127.0.0.1 --cookie mycookie

  • 从此 IEx 会话连接到远程系统:

    > Node.connect(:"foo@127.0.0.1")

    这应该返回true。请注意,我使用的是长名称(-name而不是-sname像您所做的那样),但短名称也应该可以使用。

  • 最后打开观察者:

    > :observer.start()

    从“节点”菜单中选择您的远程系统。

这是因为 Observer 对远程机器运行了几个 RPC 调用,以便从该系统获取数据。这样您就不需要在嵌入式系统上安装任何“图形”。

要了解更多信息,请参阅http://blog.plataformatec.com.br/2016/05/tracing-and-observing-your-remote-node/

于 2021-09-27T02:32:54.317 回答