相信你做得很好。
我需要在erlang运行时捕获SIGTERM,以便我可以将ets的状态保存到dets文件&当系统再次出现时,它从停止点开始。我可以编写一个C程序来捕获SIGTERM,但VM也会捕获相同的信号。现在,我如何要求ERLANG对IGTERM进行IGNORE,以便只有我的C程序能够捕获信号和信号。将它传递给erlang,以便它可以在退出之前保存状态。
答案 0 :(得分:1)
简单的解决方案:不要将SIGTERM发送到任何Erlang VM进程。只发送给C程序,让它作为你知道如何交谈的Erlang程序的信号监听器。传统方法是让C程序在启动时写入PID,并编写一个shell命令,从某个临时文件读取C进程的PID。 shutdown shell命令不需要知道任何有关Erlang VM的信息。
但是,有更好的方法可以解决这个问题。你为什么要等SIGTERM?如果您在* nix系统上运行永远在线服务,则应该具有适用于该系统的启动和关闭脚本。那些可以向您的Erlang服务发送“干净关闭”命令,无论您何时想要编写它们(例如,它们可能是或者自己调用escripts)。
如果您在操作系统崩溃时试图防止数据丢失,那么这是错误的方法。还有其他权衡(例如总是从磁盘或外部数据存储工作的开销),因为在操作系统崩溃期间刷新到磁盘更有可能破坏或破坏所有您的数据比允许您保存最新的数据。