查看源代码 init (erts v15.2)
协调系统启动。
此模块已预加载,其中包含 init
系统进程的代码,该进程协调系统启动。启动时评估的第一个函数是 boot(BootArgs)
,其中 BootArgs
是从本地操作系统提供给 Erlang 运行时系统的命令行参数列表;请参阅 erl(1)
。
init
读取引导脚本,其中包含有关如何启动系统的指令。有关引导脚本的更多信息,请参阅 script(4)
。
init
还包含用于重启、重新启动和停止系统的函数。
命令行标志
警告
从存档文件加载代码的支持是实验性的。在准备就绪之前发布它的唯一目的是获得早期反馈。文件格式、语义、接口等可以在未来的版本中更改。
init
模块解释以下命令行标志
--
---
之后的所有内容,直到下一个标志,都被视为普通参数,可以使用get_plain_arguments/0
检索。-code_path_choice Choice
- 可以设置为strict
或relaxed
。它控制如何解释代码路径中的每个目录- 严格按照
boot script
中的显示,或者 init
可以更宽松一些,如果它可以从常规ebin
目录和存档文件中的ebin
目录中选择,则尝试查找合适的目录。
它在 OTP 27 中默认为
strict
,此选项计划在 OTP 28 中删除。- 严格按照
-epmd_module Module
- 此标志已弃用,已被kernel
应用程序参数epmd_module
取代。-eval Expr
- 在系统初始化期间扫描、解析和评估任意表达式Expr
。如果这些步骤中的任何一个失败(语法错误、解析错误或评估期间的异常),Erlang 将停止并显示错误消息。在以下示例中,Erlang 用作十六进制计算器% erl -noshell -eval 'R = 16#1F+16#A0, io:format("~.16B~n", [R])' \\ -s erlang halt BF
如果指定了多个
-eval
表达式,则会按照指定的顺序依次评估它们。-eval
表达式会与-s
和-run
函数调用按顺序进行评估(这也是按照指定的顺序)。与-s
和-run
一样,未终止的评估会阻止系统初始化过程。-extra
--extra
之后的所有内容都被视为普通参数,可以使用get_plain_arguments/0
检索。示例
% erl -extra +A 1 -- ... 1> init:get_plain_arguments(). ["+A","1","--"]
-extra
标志可以通过命令行、ERL_*FLAGS
或-args_file
传递。它仅影响传递它的实体中剩余的命令行标志。如果传递了多个-extra
标志,则会使用与ERL_*FLAGS
或-args_file
中给定的顺序相同的顺序进行连接。示例
% ERL_AFLAGS="-extra a" ERL_ZFLAGS="-extra d" erl -extra b -extra c ... 1> init:get_plain_arguments(). ["a","b","-extra","c","d"]
-S Mod [Func [Arg1, Arg2, ...]]
- 在系统初始化期间评估指定的函数调用。Func
默认为start
。如果未提供任何参数,则假定该函数的元数为 0。否则,假定该函数的元数为 1,并将列表[Arg1,Arg2,...]
作为参数。所有参数都以字符串形式传递。如果引发异常,Erlang 将停止并显示错误消息。示例
% erl -S httpd serve --port 8080 /var/www/html
这将启动 Erlang 运行时系统并评估函数
httpd:serve(["--port", "8080", "/var/www/html"])
。命令行末尾之前的所有参数都将传递给被调用的函数。该函数在初始化进程中按顺序执行,然后正常终止并将控制权传递给用户。这意味着不返回的
-S
调用会阻止进一步处理;为避免这种情况,请在这种情况下使用spawn
的某些变体。-S
标志仅允许在命令行上使用。如果通过ERL_*FLAGS
或-args_file
传递,它将被解析为普通命令行标志。-run Mod [Func [Arg1, Arg2, ...]]
- 在系统初始化期间评估指定的函数调用。Func
默认为start
。如果未提供任何参数,则假定该函数的元数为 0。否则,假定该函数的元数为 1,并将列表[Arg1,Arg2,...]
作为参数。所有参数都以字符串形式传递。如果引发异常,Erlang 将停止并显示错误消息。示例
% erl -run foo -run foo bar -run foo bar baz 1 2
这将启动 Erlang 运行时系统并评估以下函数
foo:start() foo:bar() foo:bar(["baz", "1", "2"]).
这些函数在初始化进程中按顺序执行,然后正常终止并将控制权传递给用户。这意味着不返回的
-run
调用会阻止进一步处理;为避免这种情况,请在这种情况下使用spawn
的某些变体。注意
此标志不会将以连字符 (-) 开头的参数转发给指定的函数,因为这些参数将被解释为运行时的标志。如果函数使用这种形式的标志,建议改用
-S
。-s Mod [Func [Arg1, Arg2, ...]]
- 在系统初始化期间评估指定的函数调用。Func
默认为start
。如果未提供任何参数,则假定该函数的元数为 0。否则,假定该函数的元数为 1,并将列表[Arg1,Arg2,...]
作为参数。所有参数都以原子形式传递。如果引发异常,Erlang 将停止并显示错误消息。示例
% erl -s foo -s foo bar -s foo bar baz 1 2
这将启动 Erlang 运行时系统并评估以下函数
foo:start() foo:bar() foo:bar([baz, '1', '2']).
这些函数在初始化进程中按顺序执行,然后正常终止并将控制权传递给用户。这意味着不返回的
-s
调用会阻止进一步处理;为避免这种情况,请在这种情况下使用spawn
的某些变体。由于原子的长度有限,建议改用
-run
。注意
此标志不会将以连字符 (-) 开头的参数转发给指定的函数,因为这些参数将被解释为运行时的标志。如果函数使用这种形式的标志,建议改用
-S
,但需要注意的是,参数将作为字符串而不是原子传递。
示例
% erl -- a b -children thomas claire -ages 7 3 -- x y
...
1> init:get_plain_arguments().
["a","b","x","y"]
2> init:get_argument(children).
{ok,[["thomas","claire"]]}
3> init:get_argument(ages).
{ok, [["7","3"]]}
4> init:get_argument(silly).
error
另请参阅
摘要
函数
启动 Erlang 运行时系统。
返回与命令行用户标志 Flag
关联的所有值。
返回所有命令行标志和系统定义的标志,请参阅 get_argument/1
。
返回任何普通命令行参数作为字符串列表(可能为空)。
可以检查 init
进程的当前状态。
重新启动 Erlang 节点。
与 restart([])
相同。
重新启动所有 Erlang 应用程序。
获取用于启动系统的引导脚本的标识。
停止 Erlang 节点。
类型
函数
启动 Erlang 运行时系统。
此函数在启动模拟器时调用,并协调系统启动。
BootArgs
是除模拟器标志之外的所有命令行参数,即标志和普通参数;请参阅 erl(1)
。
init
解释某些标志,请参阅下面的 命令行标志 部分。其余标志(“用户标志”)和普通参数将传递给 init
循环,并且可以通过调用 get_arguments/0
和 get_plain_arguments/0
分别检索。
返回与命令行用户标志 Flag
关联的所有值。
如果多次提供 Flag
,则会按保留顺序返回每个 Values
。示例
% erl -a b c -a d
...
1> init:get_argument(a).
{ok,[["b","c"],["d"]]}
以下标志会自动定义,并且可以使用此函数检索
root
- Erlang/OTP 的安装目录,$ROOT
2> init:get_argument(root). {ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
progname
- 启动 Erlang 的程序的名称3> init:get_argument(progname). {ok,[["erl"]]}
home
- 主目录(在 Unix 上,为 $HOME 的值)4> init:get_argument(home). {ok,[["/home/harry"]]}
如果 Flag
没有关联的值,则返回 error
。
返回所有命令行标志和系统定义的标志,请参阅 get_argument/1
。
-spec get_plain_arguments() -> [Arg] when Arg :: string().
返回任何普通命令行参数作为字符串列表(可能为空)。
-spec get_status() -> {InternalStatus, ProvidedStatus} when InternalStatus :: internal_status(), ProvidedStatus :: term().
可以检查 init
进程的当前状态。
在系统启动(初始化)期间,InternalStatus
为 starting
,ProvidedStatus
指示引导脚本的解释程度。引导脚本中解释的每个 {progress, Info}
项都会影响 ProvidedStatus
,也就是说,ProvidedStatus
获取 Info
的值。
-spec reboot() -> ok.
重新启动 Erlang 节点。
在系统终止之前,所有应用程序都会被平稳关闭,所有代码都会被卸载,所有端口都会被关闭。
如果指定了命令行标志 -heart
,则 heart
程序会尝试重启系统。有关更多信息,请参阅 heart
。
为了限制关闭时间,可以使用命令行标志 -shutdown_time
来设置 init
程序关闭应用程序所允许花费的时间。
-spec restart() -> ok.
与 restart([])
相同。
-spec restart([{mode, mode()}]) -> ok.
重新启动所有 Erlang 应用程序。
系统在正在运行的 Erlang 节点内部重启,这意味着模拟器不会重启。所有应用程序都会被平稳关闭,所有代码都会被卸载,所有端口都会被关闭,然后系统会以与初始启动相同的方式再次启动。
除非给定了 mode
选项,允许将代码加载模式设置为 embedded
或 interactive
,否则在重启系统时会使用相同的 BootArgs
。所有其他 BootArgs
保持不变。
为了限制关闭时间,可以使用命令行标志 -shutdown_time
来设置 init
程序关闭应用程序所允许花费的时间。
-spec script_id() -> Id when Id :: term().
获取用于启动系统的引导脚本的标识。
Id
可以是任何 Erlang 项。在交付的启动脚本中,Id
是 {Name, Vsn}
。Name
和 Vsn
都是字符串。
-spec stop() -> ok.
与 stop(0)
相同。
-spec stop(Status) -> ok when Status :: non_neg_integer() | string().
停止 Erlang 节点。
在系统通过调用 halt(Status)
终止之前,所有应用程序都会被平稳关闭,所有代码都会被卸载,所有端口都会被关闭。如果指定了命令行标志 -heart
,则 heart
程序会在 Erlang 节点终止之前被终止。有关更多信息,请参阅 heart
。
为了限制关闭时间,可以使用命令行标志 -shutdown_time
来设置 init
程序关闭应用程序所允许花费的时间。