查看源代码 init (erts v15.2)

协调系统启动。

此模块已预加载,其中包含 init 系统进程的代码,该进程协调系统启动。启动时评估的第一个函数是 boot(BootArgs),其中 BootArgs 是从本地操作系统提供给 Erlang 运行时系统的命令行参数列表;请参阅 erl(1)

init 读取引导脚本,其中包含有关如何启动系统的指令。有关引导脚本的更多信息,请参阅 script(4)

init 还包含用于重启、重新启动和停止系统的函数。

命令行标志

警告

从存档文件加载代码的支持是实验性的。在准备就绪之前发布它的唯一目的是获得早期反馈。文件格式、语义、接口等可以在未来的版本中更改。

init 模块解释以下命令行标志

  • -- - -- 之后的所有内容,直到下一个标志,都被视为普通参数,可以使用 get_plain_arguments/0 检索。

  • -code_path_choice Choice - 可以设置为 strictrelaxed。它控制如何解释代码路径中的每个目录

    • 严格按照 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

另请参阅

erl_prim_loader, heart

摘要

类型

init 的当前状态。

代码加载模式。

函数

启动 Erlang 运行时系统。

返回与命令行用户标志 Flag 关联的所有值。

返回所有命令行标志和系统定义的标志,请参阅 get_argument/1

返回任何普通命令行参数作为字符串列表(可能为空)。

可以检查 init 进程的当前状态。

重新启动 Erlang 节点。

restart([]) 相同。

重新启动所有 Erlang 应用程序。

获取用于启动系统的引导脚本的标识。

stop(0) 相同。

停止 Erlang 节点。

类型

-type internal_status() :: starting | started | stopping.

init 的当前状态。

-type mode() :: embedded | interactive.

代码加载模式。

函数

-spec boot(BootArgs) -> no_return() when BootArgs :: [binary()].

启动 Erlang 运行时系统。

此函数在启动模拟器时调用,并协调系统启动。

BootArgs 是除模拟器标志之外的所有命令行参数,即标志和普通参数;请参阅 erl(1)

init 解释某些标志,请参阅下面的 命令行标志 部分。其余标志(“用户标志”)和普通参数将传递给 init 循环,并且可以通过调用 get_arguments/0get_plain_arguments/0 分别检索。

-spec get_argument(Flag) -> {ok, Arg} | error when Flag :: atom(), Arg :: [Values :: [string()]].

返回与命令行用户标志 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

-spec get_arguments() -> Flags when Flags :: [{Flag :: atom(), Values :: [string()]}].

返回所有命令行标志和系统定义的标志,请参阅 get_argument/1

-spec get_plain_arguments() -> [Arg] when Arg :: string().

返回任何普通命令行参数作为字符串列表(可能为空)。

-spec get_status() -> {InternalStatus, ProvidedStatus}
                    when InternalStatus :: internal_status(), ProvidedStatus :: term().

可以检查 init 进程的当前状态。

在系统启动(初始化)期间,InternalStatusstartingProvidedStatus 指示引导脚本的解释程度。引导脚本中解释的每个 {progress, Info} 项都会影响 ProvidedStatus,也就是说,ProvidedStatus 获取 Info 的值。

-spec reboot() -> ok.

重新启动 Erlang 节点。

在系统终止之前,所有应用程序都会被平稳关闭,所有代码都会被卸载,所有端口都会被关闭。

如果指定了命令行标志 -heart,则 heart 程序会尝试重启系统。有关更多信息,请参阅 heart

为了限制关闭时间,可以使用命令行标志 -shutdown_time 来设置 init 程序关闭应用程序所允许花费的时间。

-spec restart() -> ok.

restart([]) 相同。

链接到此函数

restart/1

查看源代码 (自 OTP 23.0 起)
-spec restart([{mode, mode()}]) -> ok.

重新启动所有 Erlang 应用程序。

系统在正在运行的 Erlang 节点内部重启,这意味着模拟器不会重启。所有应用程序都会被平稳关闭,所有代码都会被卸载,所有端口都会被关闭,然后系统会以与初始启动相同的方式再次启动。

除非给定了 mode 选项,允许将代码加载模式设置为 embeddedinteractive,否则在重启系统时会使用相同的 BootArgs。所有其他 BootArgs 保持不变。

为了限制关闭时间,可以使用命令行标志 -shutdown_time 来设置 init 程序关闭应用程序所允许花费的时间。

-spec script_id() -> Id when Id :: term().

获取用于启动系统的引导脚本的标识。

Id 可以是任何 Erlang 项。在交付的启动脚本中,Id{Name, Vsn}NameVsn 都是字符串。

-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 程序关闭应用程序所允许花费的时间。