檢視原始碼 erl_call

呼叫/啟動分散式 Erlang 節點。

說明

erl_call 能夠啟動分散式 Erlang 節點,並與之通訊。它是以 Erl_Interface 函式庫為基礎建立的範例應用程式。其目的是使用 Unix shell 指令碼與分散式 Erlang 節點互動。它使用標準 Erlang RPC 機制與 Erlang *rex 伺服器*進行所有通訊。它不需要在 Erlang 目標節點上執行任何特殊的軟體。

主要用途是啟動分散式 Erlang 節點或進行一般的函式呼叫。然而,也可以將 Erlang 模組透過管道傳送至 erl_call 並進行編譯,或傳送一系列 Erlang 表達式進行評估(類似於 Erlang shell)。

可以利用讀取 stdin 的選項,如同(Unix)shell 指令碼中的指令碼一樣。另一個 erl_call 的好用法是從 (HTTP) CGI-bin 指令碼中使用。

erl_call <選項>

啟動/呼叫 Erlang。

每個選項標記會在下方說明其名稱、類型和意義。

  • -a [Mod [Fun [Args]]] - (選用。) 應用指定的函式並傳回結果。必須指定 Mod。然而,未指定的 FunArgs 則會假設為 start[]Args 的格式與 erlang:apply/3ERTS 中的格式相同,但僅允許所有項目的子集。允許的項目類型為:list(以及 liststring 表示法,即 "example")、tupleatomnumber

    請注意,此標記只接受一個參數,因此可能需要引號來將 ModFunArgs 分組,分組方式取決於您的命令 shell 行為。

  • -address [Hostname:]Port - (必須是 -n-name-sname-address 其中之一。) Hostname 是執行對等節點的機器主機名稱,erl_call 將與之通訊。預設的主機名稱是本機的主機名稱。Porterl_call 將與之通訊的節點的埠號。 -address 標記不能與任何 -n-name-sname-s 標記組合使用。

    當想要呼叫在沒有可存取的 epmd 執行個體的機器上執行的節點時,-address 標記通常很有用。

  • -c Cookie - (選用。) 使用此選項指定特定的 cookie。如果未指定 cookie,則會讀取 ~/.erlang.cookie 檔案,並將其內容用作 cookie。我們想要與之通訊的 Erlang 節點必須具有相同的 cookie。

  • -d - (選用。) 除錯模式。這會導致所有 I/O 輸出到 ~/.erl_call.out.Nodename 檔案,其中 Nodename 是相關 Erlang 節點的節點名稱。

  • -e - (選用。) 從 stdin 中讀取一系列以逗號 (,) 分隔且以句號 (.) 結尾的 Erlang 表達式,直到 EOF (Control-D)。評估表達式並從最後一個表達式傳回結果。成功時傳回 {ok,Result}

  • -fetch_stdout - (選用。) 在新的程序中執行以 -a-e 選項指定的程式碼,該程序具有一個 群組領導者,該群組領導者會轉發所有 stdout(標準輸出)資料,以便將其列印到 erl_call 程序的 stdout。這表示在呼叫的程式碼執行期間,由程式碼和後代程序寫入的 stdout 資料將會被轉發(假設群組領導者尚未透過呼叫 erlang:group_leader/2 來變更)。

    列印的資料是 UTF-8 編碼。

    此選項僅與 -a-e 選項結合使用時相關。

    如需有關群組領導者概念的更多資訊,請參閱 I/O 通訊協定的文件。

    注意

    此選項僅在 erl_call 與版本大於或等於 OTP-24 的節點互動時才有效。

  • -h HiddenName - (選用。) 指定 erl_call 所代表的隱藏節點的名稱。

  • -m - (選用。) 從 stdin 讀取 Erlang 模組並編譯它。

  • -n Node - (必須是 -n-name-sname-address 其中之一。) 與 -name 的含義相同,仍然可以為了向後相容性而使用。

  • -name Node - (必須是 -n-name-sname-address 其中之一。) Node 是要啟動或通訊的對等節點的名稱。假設 Node 是使用 erl -name 啟動,這表示使用完整限定的長節點名稱。如果指定選項 -s,則 Erlang 節點(如有必要)將使用 erl -name 啟動。

  • -no_result_term - (選用。) 不列印結果項目。此選項僅與選項 -a-e 一起使用時相關。

  • -q - (選用。) 停止以開關 -n 指定的 Erlang 節點。此開關會覆寫開關 -s

  • -r - (選用。) 產生 erl_call 所代表的隱藏節點的隨機名稱。

  • -R - (選用。) 從對等節點請求 erl_call 所代表的隱藏節點的動態隨機名稱。自 OTP 23 起支援。在對同一對等節點執行重複請求時,請優先使用 -R 而不是 -r

  • -s - (選用。) 必要時啟動分散式 Erlang 節點。這表示在一系列的呼叫中,如果 '-s' 和 '-n Node' 是常數,則只有第一次呼叫會啟動 Erlang 節點。這使得其餘的通訊速度非常快。此標記目前僅適用於類 Unix 平台(Linux、Mac OS X、Solaris 等)。

  • -sname Node - (必須是 -n-name-sname-address 其中之一。) Node 是要啟動或通訊的對等節點的名稱。假設 Node 是使用 erl -sname 啟動,這表示使用短節點名稱。如果指定選項 -s,則 Erlang 節點會使用 erl -sname 啟動(如有必要)。

  • -timeout Seconds - (選用。) 在逾時到期後中止 erl_call 程序。請注意,這不會中止已使用 -a-e 或類似選項啟動的命令。

  • -v - (選用。) 列印大量 verbose 資訊。這僅對 erl_call 的開發人員和維護人員有用。

  • -x ErlScript - (選用。) 指定要使用的另一個 Erlang 啟動指令碼名稱。如果未指定,則會使用標準 erl 啟動指令碼。

範例

啟動 Erlang 節點並呼叫 erlang:time/0

erl_call -s -a 'erlang time' -n madonna
{18,27,34}

透過呼叫 erlang:halt/0 來終止 Erlang 節點

erl_call -s -a 'erlang halt' -n madonna

套用多個參數

erl_call -s -a 'lists seq [1,10]' -n madonna

評估一些表達式 (輸入以 EOF (Control-D) 結束)

erl_call -s -e -n madonna
statistics(runtime),
X=1,
Y=2,
{_,T}=statistics(runtime),
{X+Y,T}.
^D
{ok,{3,0}}

編譯模組並執行它 (同樣,輸入以 EOF (Control-D) 結束)

(在範例中,輸出已在事後格式化。)

erl_call -s -m -a procnames -n madonna
-module(procnames).
-compile(export_all).
start() ->
        P = processes(),
        F = fun(X) -> {X,process_info(X,registered_name)} end,
        lists:map(F,[],P).
^D
[{<madonna@chivas.du.etx.ericsson.se,0,0>,
                  {registered_name,init}},
 {<madonna@chivas.du.etx.ericsson.se,2,0>,
                  {registered_name,erl_prim_loader}},
 {<madonna@chivas.du.etx.ericsson.se,4,0>,
                  {registered_name,error_logger}},
 {<madonna@chivas.du.etx.ericsson.se,5,0>,
                  {registered_name,application_controller}},
 {<madonna@chivas.du.etx.ericsson.se,6,0>,
                  {registered_name,kernel}},
 {<madonna@chivas.du.etx.ericsson.se,7,0>,
                  []},
 {<madonna@chivas.du.etx.ericsson.se,8,0>,
                  {registered_name,kernel_sup}},
 {<madonna@chivas.du.etx.ericsson.se,9,0>,
                  {registered_name,net_sup}},
 {<madonna@chivas.du.etx.ericsson.se,10,0>,
                  {registered_name,net_kernel}},
 {<madonna@chivas.du.etx.ericsson.se,11,0>,
                  []},
 {<madonna@chivas.du.etx.ericsson.se,12,0>,
                  {registered_name,global_name_server}},
 {<madonna@chivas.du.etx.ericsson.se,13,0>,
                  {registered_name,auth}},
 {<madonna@chivas.du.etx.ericsson.se,14,0>,
                  {registered_name,rex}},
 {<madonna@chivas.du.etx.ericsson.se,15,0>,
                  []},
 {<madonna@chivas.du.etx.ericsson.se,16,0>,
                  {registered_name,file_server}},
 {<madonna@chivas.du.etx.ericsson.se,17,0>,
                  {registered_name,code_server}},
 {<madonna@chivas.du.etx.ericsson.se,20,0>,
                  {registered_name,user}},
 {<madonna@chivas.du.etx.ericsson.se,38,0>,
                  []}]

轉發標準輸出而不列印結果項目 (同樣,輸入以 EOF (Control-D) 結束)

erl_call -s -e -sname madonna -fetch_stdout -no_result_term
io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
^D
Number of schedulers: 8
Number of logical cores: 8