我需要在Node进程退出时执行清理操作。
我知道我可以使用process.on('exit')
,process.on('Unhandled|Rejected Exception')
和process.on('<signal>')
来听取此类事件。
但是,由于以下原因,我不想绑定任何一个:
如果我绑定到process.on('exit')
,我不应该进行任何异步操作,当您需要通过套接字或管道(afaik)写出消息时,这是不可靠的。
如果我绑定到process.on('some exceptions')
,我必须像正常节点进程一样打印错误。我不想重新发明轮子。
如果我绑定process("SIGINT")
,我必须手动退出该过程。如果其他人也在倾听,或者如果我不知道节点进程的退出状态怎么办?
知道我该怎么办?
在我的特定用例中,我将生成一个服务器,当Node退出时,我需要向它发送一个信号告诉它退出。我希望这对模块消费者来说尽可能透明。
谢谢!
答案 0 :(得分:0)
在您的用例中,您提到您有一个从nodejs模块到服务器的套接字,并且您希望在模块退出时终止服务器,因为服务器没有其他任何操作。无论你以哪种方式旋转它,客户端都没有万无一失的方式告诉服务器它通过发送消息来完成它们(因为客户端可能意外死亡),但是当它们死亡时,任何连接都是它们已经打开将关闭(在未处理的异常情况下可能需要几分钟,但它们最终会关闭)。
只要保持套接字打开,服务器就能告诉连接仍然存在。实际上两个程序之间不需要传递流量,但服务器可以告诉所有相同的流量。并且,当套接字关闭时(因为另一端已退出),服务器上的套接字将获得socket.on('end')
事件。此时,服务器可以清理资源,其空事件循环将自动关闭它。