【发布时间】:2014-11-03 18:43:55
【问题描述】:
相信你做得很好。
我需要在 erlang 运行时捕获 SIGTERM,以便我可以将 ets 的状态保存到一个 dets 文件中,并且当系统再次启动时,它会从它停止的点开始。我可以编写一个 C 程序来捕获 SIGTERM,但 VM 也会捕获相同的信号。现在我将如何要求 ERLANG 忽略 SIGTERM,以便只有我的 C 程序捕获信号并将其传递给 erlang,以便它可以在退出之前保存状态。
【问题讨论】:
相信你做得很好。
我需要在 erlang 运行时捕获 SIGTERM,以便我可以将 ets 的状态保存到一个 dets 文件中,并且当系统再次启动时,它会从它停止的点开始。我可以编写一个 C 程序来捕获 SIGTERM,但 VM 也会捕获相同的信号。现在我将如何要求 ERLANG 忽略 SIGTERM,以便只有我的 C 程序捕获信号并将其传递给 erlang,以便它可以在退出之前保存状态。
【问题讨论】:
简单的解决方案:不要将 SIGTERM 发送到任何 Erlang VM 进程。只将它发送给 C 程序,让它充当你的 Erlang 程序的信号侦听器,它知道如何与之交谈。一种传统的方法是让 C 程序在启动时写入其 PID,并编写一个 shell 命令从某个临时文件中读取 C 进程的 PID。关闭 shell 命令不需要了解有关 Erlang VM 的任何信息。
不过,有更好的方法来处理这个问题。你为什么要等SIGTERM?如果你在 *nix 系统上运行一个永远在线的服务,你应该有与系统一起工作的启动 和 关闭脚本。它们可以以任何你想写的方式向你的 Erlang 服务发送“干净关闭”命令(例如,它们可以是或调用 escripts)。
如果您试图在操作系统崩溃时防止数据丢失,那么这是错误的做法。还有其他权衡(例如始终从磁盘或外部数据存储工作的开销),因为在操作系统崩溃期间刷新到磁盘更有可能损坏或破坏 所有您的数据比允许您保存它的最新位。
【讨论】: