记一次"诡异"的mongodb进程退出事件

shell中通过mongo args &的方式启动mongo进程,退出shell重新登进之后发现mongo进程没了,查看日志发现有如下输出:

2015-06-18T18:39:58.593+0800 [signalProcessingThread] got signal 1 (Hangup), will terminate after current cmd ends
2015-06-18T18:39:58.593+0800 [signalProcessingThread] now exiting
2015-06-18T18:39:58.593+0800 [signalProcessingThread] dbexit:
2015-06-18T18:39:58.593+0800 [signalProcessingThread] shutdown: going to close listening sockets…
2015-06-18T18:39:58.593+0800 [signalProcessingThread] closing listening socket: 8
2015-06-18T18:39:58.593+0800 [signalProcessingThread] closing listening socket: 10
2015-06-18T18:39:58.593+0800 [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2015-06-18T18:39:58.593+0800 [signalProcessingThread] shutdown: going to flush diaglog…
2015-06-18T18:39:58.593+0800 [signalProcessingThread] shutdown: going to close sockets…
2015-06-18T18:39:58.593+0800 [signalProcessingThread] shutdown: waiting for fs preallocator…
2015-06-18T18:39:58.593+0800 [signalProcessingThread] shutdown: lock for final commit…
2015-06-18T18:39:58.593+0800 [signalProcessingThread] shutdown: final commit…
2015-06-18T18:39:58.603+0800 [replslave] repl: AssertionException dbclient error communicating with server: 172.19.2.176:27017
2015-06-18T18:39:58.615+0800 [signalProcessingThread] shutdown: closing all files…
2015-06-18T18:39:58.642+0800 [signalProcessingThread] closeAllFiles() finished
2015-06-18T18:39:58.642+0800 [signalProcessingThread] journalCleanup…
2015-06-18T18:39:58.642+0800 [signalProcessingThread] removeJournalFiles
2015-06-18T18:39:58.643+0800 [signalProcessingThread] shutdown: removing fs lock…
2015-06-18T18:39:58.643+0800 [signalProcessingThread] dbexit: really exiting now

可以看到有其他进程给mongo发了Hangup信息,就如同kill -1 pid,但可以确认的是没有人手动信号给mongodb进程,google之后发现这篇文章
原因大致如下:
Bash resends a SIGHUP to all jobs if it receives a SIGHUP itself; this would include mongod.
Also, if you happen to have huponexit turned on, every job will receive a SIGHUP when bash exits.
https://www.gnu.org/software/bash/manual/html_node/Signals.html

原来我用shell登进之后启动了mongo,然后退出shell使用的方式是直接关掉窗口,linux认为这是一起异常退出,这样一来这个shell进程就会收到SIGHUP信号,为了保证状态一致性,从而给它的所有子进程发送SIGHUP信号.而使用命令exit退出就不会有这种问题,因为linux会认为这是一种正常的退出
那么如何避免这种问题呢? 直接关闭窗口可能是很多人的习惯了(陋习),所以我们不能要求linux管理员总是这样做,是人就有可能会犯错,应该从根本上解决这个问题
查看mongodb官方文档会发现mongo有–fork这样的一个参数,使用该参数启动mongo时,会自动将其挂到init进程(pid为1)下启动,而不加的话ppid(父进程id)就是当前的shell进程,所以只要加上–fork问题就引刃而解了,这里需要注意的是,所有需要在后台运行的程序都需要注意该情况,务必采用像mongo –fork的方式执行
关于Linux的signal(信号)和bash更多内容请自行关注man bash

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值