解决:** exception error: undefined function observer:start/0 问题
1、当在无图形化桌面的Linux(这里是在 Win10 应用商店版 Ubuntu 18.04 LTS 子系统下进行测试)终端下运行:observer:start().
会提示 observer:start/0 函数未定义,而在win10 powershell下则可以正常运行。
如图会提示函数没有定义:** exception error: undefined function observer:start/0
2、解决办法,是通过rpc来实现间接访问 。因为在win10上可以启动查看器,所以可以通过借助win10 上的查看器来连接Linux 系统上的erlang节点。
具体步骤如下:
1.Win10上启动erlang节点并设置cookie为:abc
PS C:\Users\SummerGao> erl -name rpc@127.0.0.1 -setcookie abc
Eshell V9.1 (abort with ^G)
(rpc@127.0.0.1)1> observer:start().
ok
(rpc@127.0.0.1)2>
2.Linux系统上启动erlang节点后 设置一下当前节点的cookie(需要与win10上设置的cookie保持一致)
root@DESKTOP-VDFG4H0:/home# erl -name summergao@127.0.0.1 -setcookie abc
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]
Eshell V9.2 (abort with ^G)
(summergao@127.0.0.1)1>
如果忘记或刚开始没有设置cookie,则可以通过 erlang:set_cookie(node(), abc). 函数设置一下(可以在已经启动的节点上用这种方法设置cookie)
(summergao@127.0.0.1)1> erlang:set_cookie(node(), abc).
true
获取cookie方法
(summergao@127.0.0.1)1> auth:get_cookie().
3.下面开始连接
如下说明连接成功:
参数说明:
(1) 用-name参数启动Erlang。我们在同一台机器上运行两个节点时可以使用“短”(short)名称(通过-sname标识体现)。但如果它们属于不同的网络,我们就要使用-name。当两台机器位于同一个子网时我们也可以使用-sname。而且如果没有DNS服务, -sname就是唯一可行的方式。
(2) 确保两个节点拥有相同的cookie。这正是启动两个节点时都使用命令行参数-setcookie abc的原因。
(3) 确保相关节点的完全限定主机名(fully qualified hostname)可以被DNS解析。
(4) 确保两个系统拥有相同版本的代码和相同版本的Erlang。如果不这么做,就可能会得到严重而离奇的错误。避免问题的最简单的方法是在所有地方都运行相同版本的Erlang。不同版本的Erlang可以一起运行,但是无法保证能正常工作,所以最好事先检查一下。
参考:《Erlang程序设计(第二版)》第十四章 分布式编程
参考:https://blog.csdn.net/libaineu2004/article/details/78166077