檢視原始碼 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)
來判斷它是否要在需求模式或非需求驅動模式下執行。