我正在监视Erlang应用程序,我正在尝试确定特定PID的运行时间。绝对时间戳或持续时间对我有用,但我没有在process_info中或通过sys模块看到这些数据位。有没有办法从Erlang VM中获取此信息?
我可以从ps命令获取整个VM的开始时间,但是没有任何个人Erlang进程的可见性。
编辑:
我注意到当VM崩溃时,erl_crash.dump包含每个进程的开始时间戳,所以我知道它就在那里!
答案 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_started
中erts/emulator/beam/erl_process.h
的成员。它是struct process
中写的。在编写崩溃转储时,仅 read 位于erts/emulator/beam/erl_process.c
。
所以,是的,Erlang 会记录进程启动的(近似)时间。但是,不,你无法做到。
我不知道为什么它会接近"。
答案 2 :(得分:1)
我在工具栏中查找:start()。进程监视器,看起来不是活着的时间或时间初始化,但它很容易制作。在进程字典中,您可以在init时保存值,并且此进程可以响应有关此值的其他进程。
对于字典过程中的读取值,您可以使用get / 1和save使用put / 2(第一个键和第二个值)。
回应关于此值的其他过程与其他响应等相同。