檢視原始碼 script

啟動腳本

描述

啟動腳本 描述了 Erlang 運行時系統如何啟動。它包含要載入哪些程式碼,以及要啟動哪些進程和應用程式的指示。

指令 erl -boot Name 使用名為 Name.boot 的啟動檔案啟動系統,該檔案是使用 systools:script2boot/1Name.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}ignoreinit 進程會監控 Pid 的行為,並且如果 Pid 終止,則會終止系統。核心進程是執行時系統的關鍵元件。使用者通常不會新增新的核心進程。

  • {apply, {Mod, Func, Args}}. - init 進程會評估 apply(Mod, Func, Args)。如果這導致錯誤,系統將會終止。如果此函數永遠不返回,啟動程序將會掛起。

注意

在互動式系統中,程式碼載入器會提供需求驅動的程式碼載入,但在嵌入式系統中,程式碼載入器會立即載入所有程式碼。在這兩種情況下都使用相同版本的 code。程式碼伺服器會呼叫 init:get_argument(mode) 來判斷它是否要在需求模式或非需求驅動模式下執行。

另請參閱

systools