Erlang Slave从节点路径问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gohuge/article/details/80967603

问题引入

使用Erlang自带的ct_slave,slave启动从节点后,从节点的文件路径完全是master节点的,导致无法操作本地文件。

我们的目的是从节点代码采用master,但是文件路径依然是本地的。

这里主要是因为我们做file操作的时候file_server指向了全局的file_server所以路径采用的是进程所在节点的路径,

不过通过prim_file操作文件就绕过了file_server直接操作本地文件。

虽然可以通过prim_file解决这个问题,但项目中不免使用了一些插件,如mnesia,lagger等他们都是直接采用的是file操作文件,

你也不可能把这些插件操作的方式都改了。

所以我们需要另外一种解决办法(代码采用master,但文件路径是操作本地的)

为达到目的先了解一些基础问题:

1、Erlang为什么采用slave:start之后,子节点的file路径就会选择为master节点;

原因:-loader inet 我们修改了这个加载方式,但我们又需要该方式加载master代码。

2、从节点加载master的Code又是怎么加载的

子节点要加载远端节点的代码,通常做法是在启动项配置-loader inet host,表示加载对应host的代码;

当然需要先启动erl_boot_server,并且添加子节点信任,erl_boot_server:add_slave。

此时只要cookie相同,则子节点就会加载远端的代码

3、启动子节点有哪些方式,通常如下

a、子节点运行sh文件启动

b、远端节点通过port直接启动,如slave模块,

问题:

通常自己写的sh文件,基本就包含 cookie,ssl,mnesia,-detached -noinput等,如果指填写这些参数

slave节点只会加载代码,不会操作远端文件,那为什么slave模块启动的会出问题。

必须采用prim_file才行,因为file的每次操作都是方位FILE_SERVER 进程执行的。

为什么slave执行的start会有问题,主要是这段代码!!!多了一个 “ -master “

slave启动的时候是port根据rsh,直接向远端执行erl + 上述的cmd执行的。

此时多了大家并不注意的 -master 参数,那么它又做了些什么,在file_server启动的时候

在验证是否存在-master ,启动文件进程的方式不同,而下面的启动方式则是造成子节点启动后文件操作的是master的原因。

最后来检查,是否代码正常加载,切目录采用的是本地目录:

猜你喜欢

转载自blog.csdn.net/gohuge/article/details/80967603