在阅读mongodb文件时,最突出的一点是:
警告: 永远不要使用杀死-9 (即SIGKILL)来终止单神实例。
在使用foreman start启动节点服务器时,我遇到了一些问题。Foreman将使用相同的PID启动多个节点进程。
但是问题是,当我停止我的节点进程时,节点实际上不会停止运行并继续使用它侦听的端口。
为了解决这个问题,我一直在使用sudo kill -9 <PID>作为我想要终止的节点进程。这样做有什么负面影响吗?
此外,为什么孟戈警告不要使用杀死-9来终止一个单神实例?
发布于 2015-07-01 19:37:18
它并没有给这个过程一个干净的机会:
1)关闭套接字连接
2)清理临时文件
3)告诉它的孩子,它要离开了
4)重新设置终端特性。
这些都是当您使用kill -9时可能发生的事情的不良后果。只有当其他一切都失败时,您才应该使用kill -9作为最后的手段。
至于第二个问题,因为kill -9会杀死进程,即使它正在做一些事情,而kill在一个干净的退出之后会关闭这个进程。
发布于 2015-07-01 19:41:52
使用SIGKILL (-9)代替更常见的SIGTERM (无参数)或SIGHUP (-1)意味着进程在OS级别被终止。Mongo将大量数据作为缓存保存在内存中,用于读写。因此,使用SIGKILL可能意味着数据被半写到磁盘,或者永远不会被写入。在任何一种情况下,您都可能得到一个损坏的数据库,或者以丢失的数据作为成功存储的方式传递给用户或其他进程。“经典”数据库系统通过使用事务日志来解决这个问题(内核恐慌或电源故障在本质上是相同的),但是Mongo被认为是“nosql”是有充分理由的,包括它明显缺乏事务完整性。
这只适用于服务器进程,当然,从mongo的角度看,您可以任意地杀死节点进程。但是,通常您应该避免使用kill -9来杀死任何进程,原因与前面概述的相同。无法清理的过程往往会留下混乱。通常的顺序是:
kill <pid>...Sends SIGTERM,请求一个优雅的关闭,所以等待30秒进程关闭,如果它还活着的话:
kill -1 <pid>...Sends SIGHUP请求立即关闭,至少再等待30秒进程才能关闭,最后:
kill -9 <pid>...If、以及只有在的情况下,才允许进程继续运行,因为它会导致服务器稳定性或锁定资源方面的问题。在其他情况下,就等着吧。
要了解上面提到的“优雅”和“立即”关闭之间的差异,请考虑使用一个notepad.exe,其中键入2行。优美弹出一个对话框,询问您是否想保存,立即关闭干净没有用户交互,并‘杀死’立即停止进程,并释放所有的内存和其他资源回到系统。从历史上看,信号来自旧的拨号主机,其中SIGHUP是“H挂P”的缩写,表明用户已经离开,不能返回。
https://stackoverflow.com/questions/31170119
复制相似问题