查看源码 系统原理
启动系统
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 中定义了以下文件类型:
文件类型 | 文件名/扩展名 | 文档位置 |
---|---|---|
模块 | .erl | Erlang 参考手册 |
包含文件 | .hrl | Erlang 参考手册 |
发行资源文件 | .rel | rel in SASL |
应用程序资源文件 | .app | app in Kernel |
启动脚本 | .script | script in SASL |
二进制启动脚本 | .boot | - |
配置文件 | .config | config in Kernel |
应用程序升级文件 | .appup | appup in SASL |
发行升级文件 | relup | relup in SASL |
表:文件类型