erlang是否记录进程何时启动?

erlang是否记录进程何时启动?,erlang,Erlang,我正在监视一个Erlang应用程序,目前正在尝试确定一个特定的PID已经运行了多长时间。绝对时间戳或持续时间对我来说是可行的,但我在process_info中或通过sys模块都看不到这些数据位。有没有办法从Erlang VM中获取此信息 我可以通过ps命令获得整个VM的开始时间,但这对单个Erlang进程没有任何可见性 编辑: 我注意到,当VM崩溃时,erl_crash.dump包含每个进程的启动时间戳,所以我知道它就在那里 我在工具栏中查看:start()。进程监视器,不显示time-aliv

我正在监视一个Erlang应用程序,目前正在尝试确定一个特定的PID已经运行了多长时间。绝对时间戳或持续时间对我来说是可行的,但我在process_info中或通过sys模块都看不到这些数据位。有没有办法从Erlang VM中获取此信息

我可以通过ps命令获得整个VM的开始时间,但这对单个Erlang进程没有任何可见性

编辑:


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

我在工具栏中查看:start()。进程监视器,不显示time-alive或time-init,但很容易创建。在进程字典中,您可以在初始化时保存一个值,并且该进程可以对其他进程响应该值

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


对其他进程的响应关于此值与其他进程的响应相同,等等。

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


我想这可以为您提供解决方案的基础。

tl;医生:是的,但你无法到达它。

如果您在中深入研究OTP源代码,您会发现(通过搜索“erl_crash”),负责编写崩溃转储的文件名为
erts/emulator/beam/break.c

在该文件中搜索“started”(这是一个很好的猜测,也是崩溃转储中显示的内容)将使您找到(所有行号基于OTP-18.3.1标记),如下所示:

approx_started = (time_t) p->approx_started;
erts_print(to, to_arg, "Started: %s", ctime(&approx_started));
在源代码的其余部分中搜索
approx\u start
显示它在
erts/emulator/beam/erl\u process.h
中声明为
struct process
的成员。它是在
erts/emulator/beam/erl_process.c
中编写的。写入崩溃转储时,只有在
break.c
中读取它

因此,是的,Erlang确实记录了进程启动的(大约)时间。但是,不,你不可能做到


我不知道为什么它是“近似的”。

或者(也许是显而易见的):您可以将开始日期保持在流程状态中(在
gen_server:init
),并在询问时返回与
erlang:now
的差异。附议,保存您应该使用的
os:timestamp/0
而不是
erlang:now/0
now/0
不幸的是,需要获得一个全局锁,以保证它的返回是单调递增且唯一的。我很想这样做,但它不是我的应用程序,我只是在监视它,所以我无法对应用程序本身进行更改。我启动第二个VM并通过rpc:call发送命令。好的,我为Erlang做了一个补丁:是的,这是一个在PID死亡时收到通知的极好方法。但是我也在试图找出它是什么时候开始的。但是,如果这是为了度量,你能保证在进程结束后调用监视器的时间有多及时吗?这可能是2秒吗?这肯定有效,但需要更改应用程序本身。我可以将此作为功能请求提交,但我自己无法进行更改。如果您需要此应用程序而不是您开发的应用程序,并且您使用的是您的应用程序,我建议将此作为功能提交给应用程序开发,但不要提交给应用程序开发,或者提交给Erlang VM开发。我认为这很有趣。