查看源码 系统原理

启动系统

Erlang 运行时系统使用命令 erl 启动。

% erl
Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
1>

erl 可以识别多个命令行参数;请参考 ERTS 应用中的 erl。本章还会介绍一些参数。

应用程序可以通过调用以下函数之一来访问命令行参数的值:

重启和停止系统

通过调用 halt/0,1,2 来停止运行时系统。

模块 init 包含用于重启、重新引导和停止运行时系统的函数:

如果 Erlang shell 终止,运行时系统也会终止。

启动脚本

运行时系统使用启动脚本启动。启动脚本包含有关要加载的代码以及要启动的进程和应用程序的指令。

启动脚本文件的扩展名为 .script。运行时系统使用该脚本的二进制版本。该二进制启动脚本文件的扩展名为 .boot

要使用的启动脚本由命令行标志 -boot 指定。扩展名 .boot 可以省略。例如,使用启动脚本 start_all.boot

% erl -boot start_all

如果没有指定启动脚本,则默认使用 ROOT/bin/start,其中 ROOT 是 Erlang/OTP 的安装目录。请参阅默认启动脚本

当使用命令行标志 -init_debug 时,init 进程在解释启动脚本时会输出调试信息。

% erl -init_debug
{progress,preloaded}
{progress,kernel_load_completed}
{progress,modules_loaded}
{start,heart}
{start,logger}
  .
  .
  .

有关启动脚本的语法和内容的详细描述,请参阅 SASL 应用中的 script

默认启动脚本

Erlang/OTP 带有以下启动脚本:

  • start_clean.boot - 加载 Kernel 和 STDLIB 应用程序的代码并启动它们。
  • start_sasl.boot - 加载 Kernel、STDLIB 和 SASL 应用程序的代码并启动它们。
  • no_dot_erlang.boot - 加载 Kernel 和 STDLIB 应用程序的代码并启动它们。跳过加载 .erlang 文件。对于脚本和其他不希望受用户偏好影响的工具非常有用。

默认使用 start_clean 还是 start_sasl 取决于用户在使用 Install 安装 Erlang/OTP 时的选择。用户会被问到:

Do you want to use a minimal system startup instead of the SASL startup?

如果回答是 “yes”,则使用 start_clean,否则使用 start_sasl。选择的启动脚本会被复制并重命名为 start.boot,然后放入 ROOT/bin 目录中。

用户自定义启动脚本

有时创建用户自定义启动脚本会很有用或很有必要。在嵌入模式下运行 Erlang 时尤其如此;请参阅代码加载策略

虽然可以手动创建启动脚本,但最好使用函数 systools:make_script/1,2 从名为 Name.rel 的发行资源文件中生成它。这要求源代码按照 OTP 设计原则构建为应用程序。

有关 .rel 文件的更多信息,请参阅OTP 设计原则和 SASL 中的 rel 页面。

要生成二进制启动脚本文件 Name.boot 和启动脚本文件 Name.script,请使用 systools:script2boot(File) 函数。

代码加载策略

运行时系统可以以嵌入式交互式模式启动。具体模式由命令行标志 -mode 决定。

% erl -mode embedded

默认模式是 交互式。如果给出了多个 -mode 标志,将使用第一个。

模式属性如下:

  • 在嵌入模式下,所有代码在系统启动期间根据启动脚本加载。(代码也可以稍后通过显式命令代码服务器加载。)

  • 在交互模式下,代码在首次需要时动态加载,这意味着当尝试调用未加载的模块中的函数时,代码服务器会搜索代码路径并将该模块加载到系统中。

最初,代码路径由当前工作目录和 ROOT/lib 下的所有目标代码目录组成,其中 ROOT 是 Erlang/OTP 的安装目录。目录可以命名为 Name[-Vsn],其中 -Vsn 后缀是可选的。默认情况下,代码服务器会选择具有相同 Name 的目录中版本号最高的那个。如果 Name[-Vsn] 目录下存在 ebin 目录,则该目录也会被添加到代码路径中。

代码路径可以通过使用命令行标志 -pa Directories-pz Directories 来扩展。这些标志分别将 Directories 添加到代码路径的开头或结尾。例如:

% erl -pa /home/arne/mycode

code 模块包含多个用于修改和查询搜索路径的函数。

文件类型

Erlang/OTP 中定义了以下文件类型:

文件类型文件名/扩展名文档位置
模块.erlErlang 参考手册
包含文件.hrlErlang 参考手册
发行资源文件.relrel in SASL
应用程序资源文件.appapp in Kernel
启动脚本.scriptscript in SASL
二进制启动脚本.boot-
配置文件.configconfig in Kernel
应用程序升级文件.appupappup in SASL
发行升级文件reluprelup in SASL

表:文件类型