为节点进程使用kill -9的后果?

当读mongodb的文档时 ,突出的一件事是:

警告

千万不要使用kill -9(即SIGKILL)来终止一个mongod实例。

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

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

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

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

它并没有给这个过程一个干净的机会:

1)关闭套接字连接

2)清理临时文件

3)通知其孩子,它正在消失

4)重置其终端特性

这些是使用kill -9时可能发生的不良后果。 如果一切都失败了,你只能使用kill -9作为最后的手段。

而对于第二个问题,因为kill -9会杀死进程,即使它正在执行某些操作, kill也会在干净退出之后关闭进程。

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

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

 kill <pid> 

…发送SIGTERM ,请求正常关机,因此如果进程仍然活着,请等待30秒以关闭进程:

 kill -1 <pid> 

…发送SIGHUP ,请求立即关闭,至少等待30秒关闭进程,最后:

 kill -9 <pid> 

当且仅当该进程不能被允许继续运行,因为它引起服务器稳定性或锁定资源方面的问题。 在所有其他情况下,只需等待。

对于上面提到的“优雅”和“即时”关机之间的区别,可以考虑在其中输入2行的notepad.exe 。 优雅的弹出一个对话框询问是否要保存,立即关闭干净,没有用户交互,'杀死'立即停止进程,释放所有的内存和其他资源回到系统。 从历史上看,信号来自旧的拨号主机, SIGHUP是“挂断”的简称,表示用户已经离开,不能返回。