当读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
是“挂断”的简称,表示用户已经离开,不能返回。