檢視原始碼 init (erts v15.2)
協調系統啟動。
此模組為預先載入,並包含 init
系統程序的程式碼,該程序協調系統的啟動。啟動時評估的第一個函數是 boot(BootArgs)
,其中 BootArgs
是從本機作業系統提供給 Erlang 執行時系統的命令列參數列表;請參閱 erl(1)
。
init
會讀取啟動腳本,其中包含有關如何啟動系統的指示。有關啟動腳本的詳細資訊,請參閱 script(4)
。
init
也包含重新啟動、重新開機和停止系統的函數。
命令列旗標
警告
對從封存檔案載入程式碼的支援為實驗性質。在準備就緒之前發布它的唯一目的是為了獲得早期回饋。檔案格式、語義、介面等等,可能會在未來版本中變更。
init
模組會解譯下列命令列旗標
--
---
之後到下一個旗標之前的所有內容都被視為純參數,可以使用get_plain_arguments/0
檢索。-code_path_choice Choice
- 可以設定為strict
或relaxed
。它控制如何解譯程式碼路徑中的每個目錄- 嚴格按照它在
啟動腳本
中的顯示方式,或者 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
另請參閱
摘要
函數
啟動 Erlang 執行時系統。
傳回與命令列使用者旗標 Flag
相關聯的所有值。
傳回所有命令列旗標和系統定義的旗標,請參閱 get_argument/1
。
以字串列表形式傳回任何純命令列參數(可能為空)。
可以檢查 init
程序目前的狀態。
重新開機 Erlang 節點。
與 restart([])
相同。
重新啟動所有 Erlang 應用程式。
取得用於啟動系統的啟動腳本的識別碼。
停止 Erlang 節點。
類型
函數
啟動 Erlang 執行時系統。
此函數會在啟動模擬器並協調系統啟動時呼叫。
BootArgs
是除模擬器旗標之外的所有命令列參數,即旗標和純參數;請參閱 erl(1)
。
init
會解譯部分旗標,請參閱下方 命令列旗標 一節。剩餘的旗標(「使用者旗標」)和純參數會傳遞到 init
迴圈,並且可以分別透過呼叫 get_arguments/0
和 get_plain_arguments/0
檢索。
傳回與命令列使用者旗標 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
。
傳回所有命令列旗標和系統定義的旗標,請參閱 get_argument/1
。
-spec get_plain_arguments() -> [Arg] when Arg :: string().
以字串列表形式傳回任何純命令列參數(可能為空)。
-spec get_status() -> {InternalStatus, ProvidedStatus} when InternalStatus :: internal_status(), ProvidedStatus :: term().
可以檢查 init
程序目前的狀態。
在系統啟動(初始化)期間,InternalStatus
為 starting
,而 ProvidedStatus
指示啟動腳本已解譯的程度。在啟動腳本中解譯的每個 {progress, Info}
詞彙都會影響 ProvidedStatus
,也就是說,ProvidedStatus
會取得 Info
的值。
-spec reboot() -> ok.
重新開機 Erlang 節點。
在系統終止之前,會順利關閉所有應用程式、卸載所有程式碼,並關閉所有連接埠。
如果指定命令列旗標 -heart
,則 heart
程式會嘗試重新開機系統。有關詳細資訊,請參閱 heart
。
為了限制關機時間,應使用命令列旗標 -shutdown_time
來限制 init
允許用於關閉應用程式的時間。
-spec restart() -> ok.
與 restart([])
相同。
-spec restart([{mode, mode()}]) -> ok.
重新啟動所有 Erlang 應用程式。
系統會在正在執行的 Erlang 節點內部重新啟動,這表示不會重新啟動模擬器。在系統以與最初啟動時相同的方式再次啟動之前,會順利關閉所有應用程式、卸載所有程式碼,並關閉所有連接埠。
重新啟動系統時會使用相同的 BootArgs
,除非提供 mode
選項,否則允許將程式碼載入模式設定為 embedded
或 interactive
。所有其他 BootArgs
保持不變。
為了限制關機時間,應使用命令列旗標 -shutdown_time
來限制 init
允許用於關閉應用程式的時間。
-spec script_id() -> Id when Id :: term().
取得用於啟動系統的啟動腳本的識別碼。
Id
可以是任何 Erlang 詞彙。在交付的啟動腳本中,Id
是 {Name, Vsn}
。Name
和 Vsn
是字串。
-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
允許用於關閉應用程式的時間。