Erlang从节点如何加载sys.config配置?
Erlang从节点如何加载sys.config配置?
嗨,我来帮你梳理下这个问题的原因和解决办法~
你遇到的问题核心在于peer:start传递VM参数的方式不对,以及可能存在的相对路径问题,导致从节点没能正确加载sys.config。
问题原因分析
- VM参数传递格式错误:你现在把所有启动参数拼接成了一个字符串传给
peer:start的args选项,但peer:start的args期望的是一个字符串列表,每个元素对应一个独立的Erlang VM命令行参数。把所有参数放一个字符串里,VM无法正确解析-config这类选项,自然加载不了配置文件。 - 相对路径的不确定性:你用了
../../config/sys.config这种相对路径,但从节点的工作目录可能和主节点不一样,导致找不到配置文件。
具体解决步骤
1. 拆分VM参数为列表
把原来拼接的字符串拆分成单独的参数列表,让VM能正确识别每个选项:
spawn_node(NodeName) -> Cookie = atom_to_list(erlang:get_cookie()), % 获取sys.config的绝对路径,避免相对路径问题 ConfigPath = filelib:ensure_absolute("../../config/sys.config"), % 拆分每个VM参数为单独的列表元素 VmArgs = [ "-loader", "inet", "-hosts", "127.0.0.1", "-config", ConfigPath, "-setcookie", Cookie ], {ok, _Pid, Node} = start_node(NodeName, VmArgs), pong = net_adm:ping(Node), ct:log("Slave started as ~p~n", [Node]), ok = rpc:block_call(Node, code, add_paths, [code:get_path()]), {ok, _} = rpc:block_call(Node, application, ensure_all_started, [toy_kv]), % 验证配置是否加载 ConfigCheck = rpc:block_call(Node, application, get_env, [toy_kv]), ct:log("Loaded config for toy_kv: ~p~n", [ConfigCheck]), Node. start_node(NodeName, VmArgs) -> peer:start(#{ name => node_name(NodeName), host => "127.0.0.1", args => VmArgs }).
2. 用绝对路径指定配置文件
使用filelib:ensure_absolute/1把相对路径转换成绝对路径,这样不管从节点的工作目录是什么,都能准确找到sys.config文件。
3. 验证配置加载情况
可以在启动从节点后,通过rpc:block_call(Node, application, get_env, [toy_kv])或者rpc:block_call(Node, config, get_config, [])来确认配置是否成功加载。
额外注意点
- 确保sys.config的格式是正确的Erlang术语,比如:
[{toy_kv, [{mode, distributed}, {other_key, other_val}]}]. - 只要VM启动时正确加载了sys.config,应用启动时会自动读取对应的配置项,不需要额外手动设置。
这样调整后,从节点应该就能正确加载sys.config里的配置,application:get_env/2也能返回预期的值了~
备注:内容来源于stack exchange,提问作者Hasitha
相关产品推荐
相关产品推荐

