Application 构建
test.app
{application,test,
[{description,"Test application"},
{vsn,"1.0.0"},
{modules,[test_app,test_sup]},
{registered,[test_app]},
{mod,{test_app,[]}},
{env,[]},
{applications,[kernel,stdlib]}]}.
test_app.erl
-module(test_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_Type, StartArgs) ->
io:format("test app start~n"),
case test_sup:start_link(StartArgs) of
{ok, Pid} ->
{ok, Pid};
Error ->
io:format("test app start error ~p", [Error]),
Error
end.
stop(_State) ->
ok.
test_sup.erl
-module(test_sup).
-behaviour(supervisor).
-export([start_link/1, init/1]).
start_link(_) ->
io:format("test sup start link~n"),
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
io:format("test sup init~n"),
{ok,{
{one_for_one, 1, 60},
[]}
}.
步骤:
控制台输入启动test
application:start(test).
然后启动失败
大家可以看看为什么没启动失败,遵循application的目录结构放置对应文件
有预感到可能是文件位置导致的启动失败,但是网上大家都是用的application:start()去启动,后面发现因为beam在ebin目录下,正确的启动erl进程的命令应该是 erl -pa ebin。
Erlang 启动参数
-extra:额外参数,在启动后可以通过 init:get_plain_arguments() 函数获取。
-pa
-s :指定一个 Erlang 模块,该模块包含了在启动时需要自动加载和执行的函数。
-name:设置节点名
-setcookie:设置Erlang节点的cookie值。这个参数后面跟的是cookie字符串,用于在集群中验证节点之间的通信。
-heart:启动心跳监控器,用于检测节点是否存活。
-hidden:设置节点为隐藏模式,该节点会连接到集群的所有节点,但在其他节点上执行 node() 命令时不会列出它。
-hosts:指定Erlang运行的服务器IP地址列表。
+P:设置最大进程数,范围为1024到134217727,默认为262144。
+K:启用或禁用kernel的poll机制,默认为false。
+S:设置同步线程池的线程数,范围为0到1024,默认为10。
+A:设置异步线程池的线程数,范围为0到1024,默认为10。
-smp:设置是否启用多核支持,可选值为enable或auto。
-kernel inet_dist_listen_min:节点可侦听端口的最小值
-kernel inet_dist_listen_max:节点可侦听端口的最大值.
werl -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 409600 +K true +MEas aobf +MElmbcs 512 -smp enable -hidden -pa ${CODE_PATH}/server/ebin -name ${cfg[‘nodename’]} -s main start ${start_flag} -extra ${cfg[‘node_type’]}
疑惑
modules:应用引入的所有模块,在生成启动脚本和 tar 文件的时候 systools 会用到此列表。默认为 [] 。