檢視原始碼 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
。然而,未指定的Fun
和Args
則會假設為start
和[]
。Args
的格式與erlang:apply/3
在ERTS
中的格式相同,但僅允許所有項目的子集。允許的項目類型為:list
(以及list
的string
表示法,即 "example")、tuple
、atom
和number
。請注意,此標記只接受一個參數,因此可能需要引號來將
Mod
、Fun
和Args
分組,分組方式取決於您的命令 shell 行為。-address [Hostname:]Port
- (必須是-n
、-name
、-sname
或-address
其中之一。)Hostname
是執行對等節點的機器主機名稱,erl_call
將與之通訊。預設的主機名稱是本機的主機名稱。Port
是erl_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