檢視原始碼 init (erts v15.2)

協調系統啟動。

此模組為預先載入,並包含 init 系統程序的程式碼,該程序協調系統的啟動。啟動時評估的第一個函數是 boot(BootArgs),其中 BootArgs 是從本機作業系統提供給 Erlang 執行時系統的命令列參數列表;請參閱 erl(1)

init 會讀取啟動腳本,其中包含有關如何啟動系統的指示。有關啟動腳本的詳細資訊,請參閱 script(4)

init 也包含重新啟動、重新開機和停止系統的函數。

命令列旗標

警告

對從封存檔案載入程式碼的支援為實驗性質。在準備就緒之前發布它的唯一目的是為了獲得早期回饋。檔案格式、語義、介面等等,可能會在未來版本中變更。

init 模組會解譯下列命令列旗標

  • -- - -- 之後到下一個旗標之前的所有內容都被視為純參數,可以使用 get_plain_arguments/0 檢索。

  • -code_path_choice Choice - 可以設定為 strictrelaxed。它控制如何解譯程式碼路徑中的每個目錄

    • 嚴格按照它在 啟動腳本 中的顯示方式,或者
    • init 可以更寬鬆一些,如果可以從正規的 ebin 目錄和封存檔案中的 ebin 目錄中選擇,則會嘗試尋找合適的目錄。

    從 OTP 27 開始,預設為 strict,並且此選項計劃在 OTP 28 中移除。

  • -epmd_module Module - 此旗標已棄用,並已由 kernel 應用程式參數 epmd_module 取代。

  • -eval Expr - 在系統初始化期間掃描、解析和評估任意表達式 Expr。如果任何這些步驟失敗(語法錯誤、解析錯誤或評估期間的例外狀況),Erlang 會停止並顯示錯誤訊息。在以下範例中,Erlang 用作十六進位計算器

    % erl -noshell -eval 'R = 16#1F+16#A0, io:format("~.16B~n", [R])' \\
    -s erlang halt
    BF

    如果指定多個 -eval 表達式,則會依照指定的順序依序評估它們。-eval 表達式會依序與 -s-run 函數呼叫一起評估(這也按照指定的順序)。與 -s-run 相同,未終止的評估會封鎖系統初始化程序。

  • -extra - -extra 之後的所有內容都被視為純參數,可以使用 get_plain_arguments/0 檢索。

    範例

    % erl -extra +A 1 --
    ...
    1> init:get_plain_arguments().
    ["+A","1","--"]

    -extra 旗標可以在命令列中、透過 ERL_*FLAGS-args_file 傳遞。它只會影響在其傳遞的實體中剩餘的命令列旗標。如果傳遞多個 -extra 旗標,則會使用與給定 ERL_*FLAGS-args_file 相同的順序規則串聯它們。

    範例

    % ERL_AFLAGS="-extra a" ERL_ZFLAGS="-extra d" erl -extra b -extra c
    ...
    1> init:get_plain_arguments().
    ["a","b","-extra","c","d"]
  • -S Mod [Func [Arg1, Arg2, ...]] - 在系統初始化期間評估指定的函數呼叫。Func 預設為 start。如果未提供任何參數,則假設該函數的元數為 0。否則,假設該函數的元數為 1,並將列表 [Arg1,Arg2,...] 作為參數。所有參數都以字串形式傳遞。如果引發例外狀況,Erlang 會停止並顯示錯誤訊息。

    範例

    % erl -S httpd serve --port 8080 /var/www/html

    這會啟動 Erlang 執行時系統並評估函數 httpd:serve(["--port", "8080", "/var/www/html"])。直到命令列結尾的所有參數都會傳遞給被呼叫的函數。

    該函數會依序在初始化程序中執行,然後正常終止並將控制權傳遞給使用者。這表示不傳回的 -S 呼叫會封鎖進一步處理;為了避免這種情況,請在這種情況下使用 spawn 的某些變體。

    -S 旗標僅允許在命令列中使用。如果透過 ERL_*FLAGS-args_file 傳遞,則會將其解析為一般的命令列旗標。

  • -run Mod [Func [Arg1, Arg2, ...]] - 在系統初始化期間評估指定的函數呼叫。Func 預設為 start。如果未提供任何參數,則假設該函數的元數為 0。否則,假設該函數的元數為 1,並將列表 [Arg1,Arg2,...] 作為參數。所有參數都以字串形式傳遞。如果引發例外狀況,Erlang 會停止並顯示錯誤訊息。

    範例

    % erl -run foo -run foo bar -run foo bar baz 1 2

    這會啟動 Erlang 執行時系統並評估下列函數

    foo:start()
    foo:bar()
    foo:bar(["baz", "1", "2"]).

    這些函數會依序在初始化程序中執行,然後正常終止並將控制權傳遞給使用者。這表示不傳回的 -run 呼叫會封鎖進一步處理;為了避免這種情況,請在這種情況下使用 spawn 的某些變體。

    注意

    此旗標不會將以連字符號 (-) 開頭的參數轉發到指定的函數,因為這些參數將被解譯為執行時的旗標。如果函數使用此形式的旗標,建議改用 -S

  • -s Mod [Func [Arg1, Arg2, ...]] - 在系統初始化期間評估指定的函數呼叫。Func 預設為 start。如果未提供任何參數,則假設該函數的元數為 0。否則,假設該函數的元數為 1,並將列表 [Arg1,Arg2,...] 作為參數。所有參數都以原子形式傳遞。如果引發例外狀況,Erlang 會停止並顯示錯誤訊息。

    範例

    % erl -s foo -s foo bar -s foo bar baz 1 2

    這會啟動 Erlang 執行時系統並評估下列函數

    foo:start()
    foo:bar()
    foo:bar([baz, '1', '2']).

    這些函數會依序在初始化程序中執行,然後正常終止並將控制權傳遞給使用者。這表示不傳回的 -s 呼叫會封鎖進一步處理;為了避免這種情況,請在這種情況下使用 spawn 的某些變體。

    由於原子長度有限,建議改用 -run

    注意

    此旗標不會將以連字符號 (-) 開頭的參數轉發到指定的函數,因為這些參數將被解譯為執行時的旗標。如果函數使用此形式的旗標,建議改用 -S,但額外的警告是,參數會以字串而不是原子的形式傳遞。

範例

% erl -- a b -children thomas claire -ages 7 3 -- x y
...

1> init:get_plain_arguments().
["a","b","x","y"]
2> init:get_argument(children).
{ok,[["thomas","claire"]]}
3> init:get_argument(ages).
{ok, [["7","3"]]}
4> init:get_argument(silly).
error

另請參閱

erl_prim_loaderheart

摘要

類型

init 的目前狀態。

程式碼載入模式。

函數

啟動 Erlang 執行時系統。

傳回與命令列使用者旗標 Flag 相關聯的所有值。

傳回所有命令列旗標和系統定義的旗標,請參閱 get_argument/1

以字串列表形式傳回任何純命令列參數(可能為空)。

可以檢查 init 程序目前的狀態。

重新開機 Erlang 節點。

restart([]) 相同。

重新啟動所有 Erlang 應用程式。

取得用於啟動系統的啟動腳本的識別碼。

stop(0) 相同。

停止 Erlang 節點。

類型

-type internal_status() :: starting | started | stopping.

init 的目前狀態。

-type mode() :: embedded | interactive.

程式碼載入模式。

函數

-spec boot(BootArgs) -> no_return() when BootArgs :: [binary()].

啟動 Erlang 執行時系統。

此函數會在啟動模擬器並協調系統啟動時呼叫。

BootArgs 是除模擬器旗標之外的所有命令列參數,即旗標和純參數;請參閱 erl(1)

init 會解譯部分旗標,請參閱下方 命令列旗標 一節。剩餘的旗標(「使用者旗標」)和純參數會傳遞到 init 迴圈,並且可以分別透過呼叫 get_arguments/0get_plain_arguments/0 檢索。

-spec get_argument(Flag) -> {ok, Arg} | error when Flag :: atom(), Arg :: [Values :: [string()]].

傳回與命令列使用者旗標 Flag 相關聯的所有值。

如果多次提供 Flag,則會以保留的順序傳回每個 Values。範例

% erl -a b c -a d
...
1> init:get_argument(a).
{ok,[["b","c"],["d"]]}

下列旗標會自動定義,並可以使用此函數檢索

  • root - Erlang/OTP 的安裝目錄,$ROOT

    2> init:get_argument(root).
    {ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
  • progname - 啟動 Erlang 的程式名稱

    3> init:get_argument(progname).
    {ok,[["erl"]]}
  • home - 主目錄(在 Unix 上為 $HOME 的值)

    4> init:get_argument(home).
    {ok,[["/home/harry"]]}

如果沒有值與 Flag 相關聯,則傳回 error

-spec get_arguments() -> Flags when Flags :: [{Flag :: atom(), Values :: [string()]}].

傳回所有命令列旗標和系統定義的旗標,請參閱 get_argument/1

-spec get_plain_arguments() -> [Arg] when Arg :: string().

以字串列表形式傳回任何純命令列參數(可能為空)。

-spec get_status() -> {InternalStatus, ProvidedStatus}
                    when InternalStatus :: internal_status(), ProvidedStatus :: term().

可以檢查 init 程序目前的狀態。

在系統啟動(初始化)期間,InternalStatusstarting,而 ProvidedStatus 指示啟動腳本已解譯的程度。在啟動腳本中解譯的每個 {progress, Info} 詞彙都會影響 ProvidedStatus,也就是說,ProvidedStatus 會取得 Info 的值。

-spec reboot() -> ok.

重新開機 Erlang 節點。

在系統終止之前,會順利關閉所有應用程式、卸載所有程式碼,並關閉所有連接埠。

如果指定命令列旗標 -heart,則 heart 程式會嘗試重新開機系統。有關詳細資訊,請參閱 heart

為了限制關機時間,應使用命令列旗標 -shutdown_time 來限制 init 允許用於關閉應用程式的時間。

-spec restart() -> ok.

restart([]) 相同。

連結到此函數

restart/1

檢視原始碼 (自 OTP 23.0 起)
-spec restart([{mode, mode()}]) -> ok.

重新啟動所有 Erlang 應用程式。

系統會正在執行的 Erlang 節點內部重新啟動,這表示不會重新啟動模擬器。在系統以與最初啟動時相同的方式再次啟動之前,會順利關閉所有應用程式、卸載所有程式碼,並關閉所有連接埠。

重新啟動系統時會使用相同的 BootArgs,除非提供 mode 選項,否則允許將程式碼載入模式設定為 embeddedinteractive。所有其他 BootArgs 保持不變。

為了限制關機時間,應使用命令列旗標 -shutdown_time 來限制 init 允許用於關閉應用程式的時間。

-spec script_id() -> Id when Id :: term().

取得用於啟動系統的啟動腳本的識別碼。

Id 可以是任何 Erlang 詞彙。在交付的啟動腳本中,Id{Name, Vsn}NameVsn 是字串。

-spec stop() -> ok.

stop(0) 相同。

-spec stop(Status) -> ok when Status :: non_neg_integer() | string().

停止 Erlang 節點。

在系統終止前,會先順利關閉所有應用程式、卸載所有程式碼,並關閉所有連接埠,然後透過呼叫 halt(Status) 來終止系統。如果指定了命令列參數 -heart,則會在 Erlang 節點終止前終止 heart 程式。如需更多資訊,請參閱 heart

為了限制關機時間,應使用命令列旗標 -shutdown_time 來限制 init 允許用於關閉應用程式的時間。