簡體   English   中英

無法從shell生成erlang管理程序

[英]Cannot spawn an erlang supervisor from the shell

我已經實現了gen_server和supervisor: test_servertest_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_serverecho_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM