【问题标题】:CATCH SIGTERM IN ERLANG在 ERLANG 中捕获 SIGTERM
【发布时间】:2014-11-03 18:43:55
【问题描述】:

相信你做得很好。

我需要在 erlang 运行时捕获 SIGTERM,以便我可以将 ets 的状态保存到一个 dets 文件中,并且当系统再次启动时,它会从它停止的点开始。我可以编写一个 C 程序来捕获 SIGTERM,但 VM 也会捕获相同的信号。现在我将如何要求 ERLANG 忽略 SIGTERM,以便只有我的 C 程序捕获信号并将其传递给 erlang,以便它可以在退出之前保存状态。

【问题讨论】:

标签: erlang signals


【解决方案1】:

简单的解决方案:不要将 SIGTERM 发送到任何 Erlang VM 进程。只将它发送给 C 程序,让它充当你的 Erlang 程序的信号侦听器,它知道如何与之交谈。一种传统的方法是让 C 程序在启动时写入其 PID,并编写一个 shell 命令从某个临时文件中读取 C 进程的 PID。关闭 shell 命令不需要了解有关 Erlang VM 的任何信息。

不过,有更好的方法来处理这个问题。你为什么要等SIGTERM?如果你在 *nix 系统上运行一个永远在线的服务,你应该有与系统一起工作的启动 关闭脚本。它们可以以任何你想写的方式向你的 Erlang 服务发送“干净关闭”命令(例如,它们可以是或调用 escripts)。

如果您试图在操作系统崩溃时防止数据丢失,那么这是错误的做法。还有其他权衡(例如始终从磁盘或外部数据存储工作的开销),因为在操作系统崩溃期间刷新到磁盘更有可能损坏或破坏 所有您的数据比允许您保存它的最新位。

【讨论】:

  • 但是当我的机器宕机时,它会自动向所有正在运行的进程发送 SIGTERM
  • 哦,明白了,你的意思是说我写了一个关闭脚本干净地关闭我的进程:).....让我确认一下
  • @Khanjarrr 你明白了。关闭脚本是执行此操作的最佳方法。它是操作系统希望您执行的操作。如果您只是赶上 SIGTERM,那么您就是在与操作系统竞争关闭!我的一些系统在不到一秒的时间内就关闭了。给他们足够的时间将超过几兆的实时数据转储到磁盘的唯一方法是使用关闭脚本。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 2019-11-05
  • 2018-10-29
  • 2011-08-27
  • 2019-11-06
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多