如何从任何链接的进程中获取崩溃通知?

问题描述

我通过Supervisor,Dynamic Supervisor,有时只是直接的start_link,在我的应用程序中启动了多个(genserver)进程。当我使用import tensorflow as tf x = tf.constant([3,5,7]) y = tf.constant([1,2,3]) z1 = tf.add(x,y) z2 = x*y z3 = z2-z1 print(z1) print(z2) print(z3) tf.Tensor([ 4 7 10],shape=(3,),dtype=int32) tf.Tensor([ 3 10 21],dtype=int32) tf.Tensor([-1 3 11],dtype=int32) 启动应用程序时,其中一些可能会崩溃而不通知我。如果我自己没有捕获到崩溃,如何确保我从任何进程收到所有崩溃通知?在跟踪所有事件的同时,“让进程崩溃”的良好做法是什么?

iex -S mix

解决方法

来自GenServer docs

如果回调(init / 1除外)执行以下操作之一,则会调用

terminate / 2

-返回:stop元组
-提高
调用Kernel.exit / 1
-返回无效值
-GenServer捕获出口(使用Process.flag / 2),父进程发送出口信号

如果是监督树的一部分,GenServer将收到退出信号 当树关闭时。退出信号基于 儿童规范中的关机策略,
...
...
如果GenServer收到退出信号(不是:normal) 当它没有被捕获时从任何进程退出都会突然退出 出于同样的原因,所以不调用终止/ 2。注意一个过程 默认情况下不会捕获出口,并且当 链接的进程退出或其节点断开连接。

因此,不能保证当a GenServer退出。因此,我们通常建议 通过使用以下方法在单独的过程中发生清理规则 监视或通过链接本身。当 GenServer控制端口(例如:gen_tcp.socket)或 File.io_device / 0,因为它们将在收到 GenServer的退出信号,不需要手动关闭 终止/ 2。

,

由于使用了@ 7stud,我最终使用的解决方案是在Elixir记录器中激活SASL和OTP登录。

如果使用混合,则可以将以下行添加到config/config.exs

config :logger,handle_otp_reports: true,handle_sasl_reports: true

有关更多信息,请参见elixir logger documentation