在阅读mongodb's documentation时,其中一个突出的是:
警告 :
永远不要使用kill -9(即SIGKILL)来终止mongod实例。
在使用foreman start
启动节点服务器时,我遇到了一些问题。 Foreman将使用相同的PID启动多个节点进程。
然而问题是,当我停止节点进程时,节点实际上不会停止运行并继续使用它正在侦听的端口。
要解决这个问题,我一直在使用sudo kill -9 <PID>
作为我要终止的节点进程。这样做有任何负面后果吗?
另外,为什么Mongo警告不要使用kill -9终止mongod实例?
答案 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
是“挂断”的缩写,表示用户已离开且无法返回。