分段错误后重新启动Erlang节点

时间:2013-11-11 14:46:14

标签: c erlang erlang-shell erlang-ports

我目前正在运行一个通过Nifs运行C代码的Erlang应用程序。但是,如果C代码中发生分段错误,整个节点都会关闭,以及运行Erlang应用程序的Erlang虚拟机。

如果虚拟机死机,监控Erlang应用程序并重新启动它的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

您想查看Heart

此外,如果您有被认为危险的NIF调用,建议将它们与在单独节点上靠近它们的Erlang代码隔离在一起。有几种方法可以监视和重新启动节点(例如Slave)。

一般情况下,我建议不要使用有问题的NIF,具体取决于你使用它们的是什么,有更稳定的替代品。

NIF的原因 - >替换

顺序速度 - >更优化的Erlang代码。通常,NIF的高顺序速度是以他们搞乱Erlangs调度程序为代价的,而这通常会导致实际上更差的性能。

与外部libs / apps连接 - > Erlangs端口在故障隔离方面要好得多

答案 1 :(得分:2)

我使用了名为supervisord的东西。一些优于心脏的优点:

  1. 这不是特定的erlang,所以如果你在同一个盒子上有其他东西,你可以用它来重新启动东西
  2. Heart可以有一些weird behavior来阻止崩溃转储。
  3. 如果你真的想因某种原因停止erlang进程,那么supervisord会让这更容易。
  4. 如果在启动时发生了段错误,heart will continue to restart erlang infinitely。在一定次数的尝试后,Supervisord将停止尝试重新启动。

答案 2 :(得分:0)

如果你想用Erlang方式做,你可以选择上面提到的任何解决方案(heart,supervisord)。如果你想以Unix的方式做,首先你应该让你的Erlang应用程序像Unix守护进程一样。

使用erld。接下来你可以做一个熟悉的事情:监视/重启熟悉的Unix守护进程。