查看源代码 script
启动脚本
描述
启动脚本描述了 Erlang 运行时系统如何启动。它包含了加载哪些代码,以及启动哪些进程和应用程序的指令。
命令 erl -boot Name
使用名为 Name.boot
的启动文件启动系统,该文件使用 systools:script2boot/1
从 Name.script
文件生成。
.script
文件由 systools
从 .rel
文件和 .app
文件生成。
文件语法
启动脚本存储在扩展名为 .script
的文件中。该文件具有以下语法:
{script, {Name, Vsn},
[
{progress, loading},
{preLoaded, [Mod1, Mod2, ...]},
{path, [Dir1,"$ROOT/Dir",...]}.
{primLoad, [Mod1, Mod2, ...]},
...
{kernel_load_completed},
{progress, loaded},
{kernelProcess, Name, {Mod, Func, Args}},
...
{apply, {Mod, Func, Args}},
...
{progress, started}]}.
Name = string()
- 定义系统名称。Vsn = string()
- 定义系统版本。{progress, Term}
- 设置初始化程序的“进度”。init:get_status/0
函数返回当前进度值,其格式为{InternalStatus,Term}
。{path, [Dir]}
-Dir
是一个字符串。此参数将系统的加载路径设置为[Dir]
。用于加载模块的加载路径从脚本文件中给定的初始加载路径,以及命令行参数中提供的任何路径标志获得。命令行参数按如下方式修改路径:-pa Dir1 Dir2 ... DirN
将目录DirN, DirN-1, ..., Dir2, Dir1
添加到初始加载路径的前面。-pz Dir1 Dir2 ... DirN
将目录Dir1, Dir2, ..., DirN
添加到初始加载路径的末尾。-path Dir1 Dir2 ... DirN
定义一组目录Dir1, Dir2, ..., DirN
,这些目录将替换脚本文件中给定的搜索路径。路径中的目录名称解释如下:- 以
/
开头的目录名称被认为是绝对路径名称。 - 不以
/
开头的目录名称被认为是相对于当前工作目录的相对路径名称。 - 特殊的
$ROOT
变量只能在脚本中使用,而不能作为命令行参数使用。给定的目录是相对于 Erlang 安装目录的。
- 以
{primLoad, [Mod]}
- 从Path
中指定的目录加载模块[Mod]
。脚本解释器通过调用erl_prim_loader:get_file(Mod)
获取适当的模块。如果无法找到模块,则会发生导致系统终止的致命错误。{kernel_load_completed}
- 表示在启动任何进程之前必须加载的所有模块都已加载。在交互模式下,此命令之后解释的所有{primLoad,[Mod]}
命令都将被忽略,这些模块将按需加载。在嵌入式模式下,kernel_load_completed
将被忽略,所有模块在系统启动期间加载。{kernelProcess, Name, {Mod, Func, Args}}
- 通过评估apply(Mod, Func, Args)
来启动“内核进程”Name
。启动函数应返回{ok, Pid}
或ignore
。init
进程会监控Pid
的行为,并在Pid
死亡时终止系统。内核进程是运行时系统的关键组件。用户通常不会添加新的内核进程。{apply, {Mod, Func, Args}}
. - init 进程评估apply(Mod, Func, Args)
。如果这导致错误,系统将终止。如果此函数永远不返回,启动过程将挂起。
注意
在交互式系统中,代码加载器提供按需代码加载,但在嵌入式系统中,代码加载器会立即加载所有代码。在这两种情况下都使用相同版本的
code
。代码服务器调用init:get_argument(mode)
来确定它是在按需模式还是非按需驱动模式下运行。