将kill -9用于节点进程的后果是什么?

时间:2015-07-01 19:33:56

标签: linux node.js mongodb

在阅读mongodb's documentation时,其中一个突出的是:

  

警告

     

永远不要使用kill -9(即SIGKILL)来终止mongod实例。

在使用foreman start启动节点服务器时,我遇到了一些问题。 Foreman将使用相同的PID启动多个节点进程。

然而问题是,当我停止节点进程时,节点实际上不会停止运行并继续使用它正在侦听的端口。

要解决这个问题,我一直在使用sudo kill -9 <PID>作为我要终止的节点进程。这样做有任何负面后果吗?

另外,为什么Mongo警告不要使用kill -9终止mongod实例?

2 个答案:

答案 0 :(得分:5)

它不会让这个过程有机会干净利落:

1)关闭套接字连接

2)清理临时文件

3)告知孩子它会消失

4)重置其终端特性

这些是使用kill -9时可能发生的不良后果。如果所有其他方法都失败,您应该只使用kill -9作为最后的手段。

对于第二个问题,因为kill -9即使在执行某事时也会终止进程,而kill将在干净退出后关闭进程。

答案 1 :(得分:2)

使用SIGKILL-9)代替更常见的SIGTERM(无参数)或SIGHUP-1)意味着该进程在OS级别。 Mongo将大量数据作为缓存保存在内存中,用于读写。因此,使用SIGKILL可能意味着数据被写入磁盘的一半,或者根本不会写入。在任何一种情况下,您都可能获得损坏的数据库,或者最终丢失与成功存储的用户或其他进程通信的数据。 “经典”数据库系统通过使用事务日志来解决这个问题(内核恐慌或电源故障本质上是相同的效果),但Mongo被认为是“nosql”的原因很充分,包括显着缺乏事务完整性。

这仅适用于服务器进程,当然,您可以从mongo的角度以任何方式终止您的节点进程。但是,一般情况下,您应避免使用kill -9来杀死任何进程,原因与上述相同。无法清理的流程往往会造成混乱。通常的顺序是:

kill <pid>

...发送SIGTERM,请求正常关闭,等待30秒让进程关闭,如果它仍然存在:

kill -1 <pid>

...发送SIGHUP,请求立即关机,至少再等30秒才能关闭进程,最后:

kill -9 <pid>

...如果,且仅当时,不允许该进程继续运行,因为它会导致服务器稳定性问题或锁定资源。在所有其他情况下,只需等待。

对于上面提到的“优雅”和“立即”关闭之间的差异,请考虑使用notepad.exe键入2行。 Graceful弹出一个对话框,询问您是否要保存,立即关闭,无需用户交互,并且“kill”立即停止进程并将所有内存和其他资源释放回系统。历史上,信号来自旧的拨入式主机,其中SIGHUP是“挂断”的缩写,表示用户已离开且无法返回。

相关问题