我試圖從erlang vm中單獨啓動epmd,以便對連接處理進行監視。啓動沒有epmd的erlang VM
這工作正常,除了在epmd之前啓動虛擬機的情況。
有沒有辦法讓erlang vm在沒有啓動epmd的情況下自己啓動?
我試圖從erlang vm中單獨啓動epmd,以便對連接處理進行監視。啓動沒有epmd的erlang VM
這工作正常,除了在epmd之前啓動虛擬機的情況。
有沒有辦法讓erlang vm在沒有啓動epmd的情況下自己啓動?
可能有幫助的問題/解答:
所以內嵌這些問題/答案,我建議讓二郎VM服務依賴於EPMD(其應該是另一項服務)。另外,如果您運行epmd作爲您的第一個運行服務之一,應該可以在每次erlang之前啓動它。但如何做到這一點實際上取決於您的操作系統和部署實施細節。
此外,一個不太優雅的解決方案是更改您的init腳本,因此它會等待epmd啓動,但是需要手動啓動。您的里程可能會有所不同,和一個非常幼稚的做法(但有用爲例)會是這樣的:
while [ true ]; do
pid=`pidof epmd`;
if [ "$pid" == "" ]; then
sleep 1; # Wait a bit more
else
break;
fi
done
# Continue initialization
注意,代碼應該考慮嘗試的最大數量,也只的pidof適用於Linux等不知道我喜歡這個解決方案,但可以完成這項工作。
作爲不太優雅的解決方案,您可以用您自己的二進制代碼來替換erlang將運行的epmd,它可以執行您需要的任何操作(如僞造epmd start或運行您自己的代碼,如上面的代碼中所示)。
希望它有幫助!
從Erlang/OTP 19.0開始,有a -start_epmd
command line option可以設置爲true
(默認值)或false
。
如果您在命令行上通過-start_epmd false
並且epmd正在運行,那麼Erlang節點將照常啓動。如果EPMD沒有運行,Erlang的節點無法啓動此消息:
$ erl -start_epmd false -sname foo
Protocol 'inet_tcp': register/listen error: econnrefused
如果二郎節點未啓動作爲分佈式節點(即,不經過-name
或-sname
),它既不啓動也不嘗試無論-start_epmd
設置如何,連接到epmd。