erlang会在进程启动时记录吗?

时间:2013-06-12 14:20:34

标签: erlang

我正在监视Erlang应用程序,我正在尝试确定特定PID的运行时间。绝对时间戳或持续时间对我有用,但我没有在process_info中或通过sys模块看到这些数据位。有没有办法从Erlang VM中获取此信息?

我可以从ps命令获取整个VM的开始时间,但是没有任何个人Erlang进程的可见性。

编辑:

我注意到当VM崩溃时,erl_crash.dump包含每个进程的开始时间戳,所以我知道它就在那里!

3 个答案:

答案 0 :(得分:3)

编写一个管理此进程的进程。由于您可以找到给定流程的PID,因此您还可以在流程上设置monitor。然后,如果进程出错,您将在邮箱中收到一条消息。

我猜这可能成为您解决方案的基础。

答案 1 :(得分:2)

tl;博士:是的,但你无法做到。

如果你在https://github.com/erlang/otp深入研究OTP源代码,你会发现(通过搜索" erl_crash"),负责编写崩溃转储的文件被调用{{ 1}}。

搜索该文件以及#34;已启动" (它是一个很好的猜测,它在崩溃转储中显示的内容)会让你到lines 248-249(基于OTP-18.3.1标签的所有行号)像这样:

erts/emulator/beam/break.c

搜索approx_started = (time_t) p->approx_started; erts_print(to, to_arg, "Started: %s", ctime(&approx_started)); 的其余源代码,表明它是approx_startederts/emulator/beam/erl_process.h的成员。它是struct process写的。在编写崩溃转储时, read 位于erts/emulator/beam/erl_process.c

所以,是的,Erlang 记录进程启动的(近似)时间。但是,不,你无法做到。

我不知道为什么它会接近"。

答案 2 :(得分:1)

我在工具栏中查找:start()。进程监视器,看起来不是活着的时间或时间初始化,但它很容易制作。在进程字典中,您可以在init时保存值,并且此进程可以响应有关此值的其他进程。

对于字典过程中的读取值,您可以使用get / 1和save使用put / 2(第一个键和第二个值)。

回应关于此值的其他过程与其他响应等相同。