[英]Cannot spawn an erlang supervisor from the shell
我已經實現了gen_server和supervisor: test_server
和test_sup
。 我想從shell / CLI測試它們。 我寫了他們的start_link
函數,以便他們的名字在本地注冊。
我發現我可以從命令行生成test_server
,但是生成的test_sup
根本不允許我與服務器進行交互。
例如,我可以通過執行以下命令生成test_server
:
1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]
我可以與服務器進行交互,一切都很好。
但是,如果我嘗試使用test_sup
執行相同的test_sup
,則在我的“CLI進程”中沒有注冊新的名稱/ Pids(使用registered/0
)。 我的test_server
似乎已經產生了,但是我無法與它進行交互(參見Lukas Larsson關於SASL的評論,看看為什么這是真的)。
我假設我在我的主管中編寫了一個錯誤,但這種啟動我的主管的方法完全正常:
1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]
為什么我可以產生gen_server但不能產生主管?
更新
我正在使用的代碼可以在這篇文章中找到。 我正在使用echo_server
和echo_sup
兩個非常簡單的模塊。
鑒於該代碼,這工作:
spawn(echo_server, start_link, []).
這不是:
spawn(echo_sup, start_link, []).
每當試圖解決這些問題時,打開SASL通常都非常有幫助。
應用程序:啟動(SASL)。
這樣你就可以了解為什么你的主管正在終止。
Bernard Duggan在Erlang問題郵件列表中給出了這個解釋:
當鏈接進程與代碼“正常”退出時,鏈接進程不會自動死亡。 這就是為什么[echo_server]在產生進程退出時不會退出的原因。 那么為什么主管會死? 事實上,管理程序模塊的內部實現為gen_server,但設置了process_flag(trap_exit,true)。 這樣做的結果是,當父進程終止時,將調用terminate()(當trap_exit被禁用時不會發生)並且超級用戶關閉。 它在主管的上下文中是有意義的,因為主管在監督樹中由其父級產生 - 如果它在父關閉時沒有死亡,無論什么原因,你都有懸掛樹的“分支”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.