有這樣做沒有API,所以我相信你堅持的升級方法,除非你想通過submitting a pull request提出爲此對OTP隊一個新的API提供的代碼修改,新的測試一個完整的補丁,文檔更改。
這樣做還有一個非常骯髒的黑客方式,涉及操縱內部監督者狀態,所以這絕對不是我推薦的生產系統,但我認爲它仍然很有趣。 A supervisor
在其內部循環狀態下存儲重啓強度。您可以通過在主管進程中調用sys:get_state/1,2
來查看此狀態。例如,這裏有一個主管在Yaws web server狀態:
1> rr(supervisor).
[child,state]
2> sys:get_state(yaws_sup).
#state{name = {local,yaws_sup},
strategy = one_for_all,
children = [#child{pid = <0.67.0>,name = yaws_sup_restarts,
mfargs = {yaws_sup_restarts,start_link,[]},
restart_type = transient,shutdown = infinity,
child_type = supervisor,
modules = [yaws_sup_restarts]},
#child{pid = <0.42.0>,name = yaws_server,
mfargs = {yaws_server,start_link,
[{env,true,false,false,false,false,false,"default"}]},
restart_type = permanent,shutdown = 120000,
child_type = worker,
modules = [yaws_server]},
#child{pid = <0.39.0>,name = yaws_trace,
mfargs = {yaws_trace,start_link,[]},
restart_type = permanent,shutdown = 5000,
child_type = worker,
modules = [yaws_trace]},
#child{pid = <0.36.0>,name = yaws_log,
mfargs = {yaws_log,start_link,[]},
restart_type = permanent,shutdown = 5000,
child_type = worker,
modules = [yaws_log]}],
dynamics = undefined,intensity = 0,period = 1,restarts = [],
module = yaws_sup,args = []}
初始rr
命令檢索從supervisor
所以我們可以看到字段名稱,當我們從yaws_sup
獲得國家備案的定義,否則我們將只得到一個充滿匿名值的元組。
所檢索的狀態示出了在這種情況下,強度爲0,我們可以使用sys:replace_state/2,3
更改:
3> sys:replace_state(yaws_sup, fun(S) -> S#state{intensity=2} end).
#state{name = {local,yaws_sup},
strategy = one_for_all,
children = [#child{pid = <0.67.0>,name = yaws_sup_restarts,
mfargs = {yaws_sup_restarts,start_link,[]},
restart_type = transient,shutdown = infinity,
child_type = supervisor,
modules = [yaws_sup_restarts]},
#child{pid = <0.42.0>,name = yaws_server,
mfargs = {yaws_server,start_link,
[{env,true,false,false,false,false,false,"default"}]},
restart_type = permanent,shutdown = 120000,
child_type = worker,
modules = [yaws_server]},
#child{pid = <0.39.0>,name = yaws_trace,
mfargs = {yaws_trace,start_link,[]},
restart_type = permanent,shutdown = 5000,
child_type = worker,
modules = [yaws_trace]},
#child{pid = <0.36.0>,name = yaws_log,
mfargs = {yaws_log,start_link,[]},
restart_type = permanent,shutdown = 5000,
child_type = worker,
modules = [yaws_log]}],
dynamics = undefined,intensity = 2,period = 1,restarts = [],
module = yaws_sup,args = []}
我們的第二個參數sys:replace_state/2
取狀態記錄作爲參數,並改變其intensity
字段設置爲2該sys:replace_state/2,3
函數返回的新狀態,你可以在這兒附近的結果看到底,intensity
現在是2而不是0
由於sys:replace_state/2,3
文檔介紹,這些功能僅適用於DEB ugging的目的,所以用它們在生產系統中這樣做絕對不是我推薦的。這裏的第二個參數replace_state
表明,這種方法需要的supervisor
內部狀態的記錄,這是我們通過rr
shell命令得到這裏的細節知識,所以如果該記錄都沒有改變,這個代碼可能會停止工作。更脆弱將治療supervisor
狀態記錄作爲一個元組並在intensity
場計數是在一個特定的元組位置,這樣你就可以改變它的值。因此,如果您真的想要改變主管重啓強度的功能,您最好長期向OTP團隊建議添加它;如果你打算採取這樣的路線,我建議首先提出關於erlang-questions mailing list的想法來衡量興趣。
太好了,謝謝,如果不是解決方案,這是一個答案,如果你打折這個你爲我們開採的相當有趣但很難看的寶石!我想我們都同意這是最好留在地上的寶石之一,或者安全地重新埋葬!我會考慮你的建議,發佈功能建議和拉動請求等。對我來說,這似乎是一個非常有效的功能,很明顯,如果假設變量均勻且死亡機會相等,則靜態重啓強度和間隔永遠不會最佳,其中總關鍵程度在整個運行集中共享。謝謝你的時間! – Michael