1 系统原理
1.1 启动系统
Erlang 运行时系统使用命令 erl 启动。
% erl
Erlang/OTP 17 [erts-6.0] [hipe] [smp:8:8]
Eshell V6.0 (abort with ^G)
1>
erl 理解许多命令行参数,请参阅 ERTS 中的 erl(1) 手册页。本章中也介绍了一些参数。
应用程序可以通过调用函数 init:get_argument(Key) 或 init:get_arguments() 来访问命令行参数的值。请参阅 ERTS 中的 init(3) 手册页。
1.2 重启和停止系统
运行时系统通过调用 halt/0,1 停止。有关详细信息,请参阅 ERTS 中的 erlang(3) 手册页。
模块 init 包含用于重启、重新启动和停止运行时系统的函数。
init:restart() init:reboot() init:stop()
有关详细信息,请参阅 ERTS 中的 init(3) 手册页。
如果 Erlang shell 终止,运行时系统将终止。
1.3 引导脚本
运行时系统使用 **引导脚本** 启动。引导脚本包含有关要加载哪些代码以及要启动哪些进程和应用程序的指令。
引导脚本文件扩展名为 .script。运行时系统使用脚本的二进制版本。这个 **二进制引导脚本** 文件扩展名为 .boot。
要使用哪个引导脚本由命令行标志 -boot 指定。扩展名 .boot 应该省略。例如,使用引导脚本 start_all.boot
% erl -boot start_all
如果未指定引导脚本,则默认为 ROOT/bin/start,请参阅 默认引导脚本。
命令行标志 -init_debug 使 init 进程在解释引导脚本时写入一些调试信息。
% erl -init_debug
{progress,preloaded}
{progress,kernel_load_completed}
{progress,modules_loaded}
{start,heart}
{start,logger}
...
有关引导脚本语法和内容的详细说明,请参阅 SASL 中的 script(4) 手册页。
默认引导脚本
Erlang/OTP 附带以下引导脚本:
- start_clean.boot - 加载 Kernel 和 STDLIB 应用程序的代码并启动它们。
- start_sasl.boot - 加载 Kernel、STDLIB 和 SASL 应用程序的代码并启动它们。
- no_dot_erlang.boot - 加载 Kernel 和 STDLIB 应用程序的代码并启动它们。跳过加载文件 .erlang。对于与用户偏好无关的行为相同的脚本和其他工具很有用。
使用 Install 安装 Erlang/OTP 时,用户决定使用 start_clean 还是 start_sasl 作为默认值。系统会询问用户“您是否要使用最小系统启动而不是 SASL 启动”。如果回答是“是”,则使用 start_clean,否则使用 start_sasl。所选引导脚本的副本将被制作,命名为 start.boot 并放置在目录 ROOT/bin 中。
用户定义的引导脚本
有时创建用户定义的引导脚本很有用或必要。这在以嵌入模式运行 Erlang 时尤其如此,请参阅 代码加载策略。
可以手动编写引导脚本。但是,建议使用函数 systools:make_script/1,2 从发布资源文件 Name.rel 生成引导脚本。这要求源代码根据 OTP 设计原则以应用程序的形式构建。(程序不必以 OTP 应用程序的形式启动,但可以是纯 Erlang)。
有关 .rel 文件的更多信息,请参阅 OTP 设计原则 和 SASL 中的 rel(4) 手册页。
二进制引导脚本文件 Name.boot 是使用函数 systools:script2boot(File) 从引导脚本文件 Name.script 生成的。
1.4 代码加载策略
运行时系统可以以 **嵌入** 或 **交互** 模式启动。哪个模式由命令行标志 -mode 决定。
% erl -mode embedded
默认模式是 interactive,额外的 -mode 标志会被忽略。
模式属性如下:
- 在嵌入模式下,所有代码都根据引导脚本在系统启动期间加载。(代码也可以通过显式命令代码服务器来加载)。
- 在交互模式下,代码在第一次引用时动态加载。当对模块中的函数进行调用时,如果模块未加载,代码服务器将搜索代码路径并将模块加载到系统中。
最初,代码路径由当前工作目录和 ROOT/lib 下的所有目标代码目录组成,其中 ROOT 是 Erlang/OTP 的安装目录。目录可以命名为 Name[-Vsn]。默认情况下,代码服务器在具有相同 Name 的目录中选择版本号最高的目录。 -Vsn 后缀是可选的。如果 Name[-Vsn] 目录下存在 ebin 目录,则此目录将添加到代码路径。
可以使用命令行标志 -pa Directories 和 -pz Directories 扩展代码路径。这些标志将分别将 Directories 添加到代码路径的开头或结尾。例如:
% erl -pa /home/arne/mycode
代码服务器模块 code 包含许多用于修改和检查搜索路径的函数,请参阅 Kernel 中的 code(3) 手册页。
1.5 文件类型
Erlang/OTP 中定义了以下文件类型:
文件类型 | 文件名/扩展名 | 记录于 |
模块 | .erl | Erlang 参考手册 |
包含文件 | .hrl | Erlang 参考手册 |
发布资源文件 | .rel | rel(4) 手册页,位于 SASL 中 |
应用程序资源文件 | .app | app(4) 手册页,位于 Kernel 中 |
引导脚本 | .script | script(4) 手册页,位于 SASL 中 |
二进制引导脚本 | .boot | - |
配置文件 | .config | config(4) 手册页,位于 Kernel 中 |
应用程序升级文件 | .appup | appup(4) 手册页,位于 SASL 中 |
发布升级文件 | relup | relup(4) 手册页,位于 SASL 中 |
表 1.1: 文件类型