我在elixir中使用观察者,以下是应用程序[在应用程序选项卡下]的快照:
我需要在完成工作后退出这些流程。不知何故,我无法弄清楚某些流程的起源。有没有办法在elixir / erlang中找出创建特定进程的模块/函数?
建议将受到高度赞赏。感谢。
答案 0 :(得分:1)
首先,您必须始终拥有流程的PID或其参考名称。
Process.info/2
将为您提供有关该流程的信息。您可以在Erlang的函数中获得有关此函数如何工作的更多文档和信息:
还有arity 1变体:Process Docs
答案 1 :(得分:1)
[erlang:process_info(Pid, initial_call) || Pid <- erlang:processes()].
但请注意,gen_server
等等都具有相同的初始调用,因此您需要深入挖掘。
以下内容改编自https://gist.github.com/rlipscombe/a8e87583d47799170f8b:
lists:map(
fun(Pid) ->
InitialCall = case erlang:process_info(Pid, initial_call) of
{initial_call,{proc_lib,init_p,A}} ->
case erlang:process_info(Pid, dictionary) of
{dictionary, D} ->
proplists:get_value('$initial_call', D, undefined);
_ ->
{proc_lib,init_p,A}
end;
{initial_call,{erlang,apply,A}} ->
case erlang:process_info(Pid, current_function) of
{current_function,MFA} -> MFA;
_ -> {erlang,apply,A}
end;
{initial_call,IC} ->
IC;
Other ->
Other
end,
{Pid, InitialCall}
end, erlang:processes()).
答案 2 :(得分:0)
使用process_info/1
,您可以获得一个流程信息列表,initial_call
和current_function
可以帮助您找到生成流程的初始函数调用以及当前函数调用这个过程分别。
process_info(Pid, initial_call)
和process_info(Pid, current_function)
函数也用作快捷方式。