记一次"诡异"的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

时间: 2024-10-11 03:58:07

记一次"诡异"的mongodb进程退出事件的相关文章

转载:进程退出状态--waitpid status意义

最近遇到一个进程突然退出的问题,由于没有注册signalhandler所以没有捕捉到任何信号. 但是从log中看到init waitpid返回的status为0x008b,以前对status不是很了解,下面的文章对status有比较全面的介绍. 转至http://tsecer.blog.163.com/blog/static/15018172012323975152/ 一.和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitX

erlang监控进程在启动进程退出后异常退出原因分析

一.问题引出 erlang监控进程在启动时设置了trap_exit为true,即会捕获到退出信号,会将退出信号转换为{'EXIT',Pid,Reason}存入自己的邮箱中,因此与监控进程link关系的进程退出后,监控进程能够很坦然的截获退出信号,自身不退出.启动erlang监控进程的进程,会和监控进程建立link关系,然而当启动进程退出时,监控进程没有象正常的情况,发生了异常退出,为什么设置了trap_exit为true,还会退出呢? 二.原因分析 查看supervisor的源码,supervi

记一次诡异的调优

最近碰到的一个Java应用,费了半天劲还是没定位到是哪儿的问.发上来给大家看看,给点建议. 环境 DB Server:32core HPUX DB2 App Server * 2:8core HPUX WAS6.1 每个节点2个app 初次测试现象 WAS,DB2CPU均上不去,CPU.内存.磁盘.网络等都正常. 从loadrunner报告来看,有两个用例很奇怪,在16/24/50用户下,呈线性增长.根据经验,这两个用例可能存在资源争用,造成串行的地方. 检查DB2,正常,语句执行都很快,部分用

TODO:Golang Linux进程退出说明

Golang使用os.Exit(code)进程退出导致当前程序退出并返回给定的状态代码.传统上,code代码为零表示成功退出,非零错误退出. syscall.Exit可以调用不同平台的操作系统的退出. code值为0-255,当code为非0时,os.Exit(code)会返回,对应值当状态码 exit status 128 当code为0,则正常退出.code值可自定义对应当意义进行相应业务场景使用.code的值在自然数是按从0至255的倍数进行循环,例如自然数为256,在进程退出的时候返回的

孤儿进程退出分析

如果父进程在子进程之前退出,必须有机制来保证子进程能找到一个新的父亲,否则这些成为孤儿的进程就会在退出时永远处于僵死状态,,白白地耗费内存.僵尸状态是在调用do_exit()函数时,最后会调用exit_notify()函数向父进程发送信号,给子进程重新找养父,养父为线程组中的其他线程或者为init进程,并把进程(存放在task_struct结构的exit_state中)设成EXIT_ZOMBIE.对于这个问题,解决方法是给子进程在当前线程组内找一个线程作为父亲,如果不行,就让init做它们的父进

Linux 进程退出后自动启动

/********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系统中,我们有时候会希望后台程序能够一直运行,即使程序出错了, * 也是希望程序能够自动启动,并继续运行. * * 2016-12-10 深圳 南山平山村 曾剑锋 *********************************************************************

Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四))

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别和联系 _exit是linux系统调用,关闭所有文件描述符,然后退出进程. exit是c语言的库函数,他最

【转】iis解决应用程序池**提供服务的进程意外终止进程ID是**。进程退出代码是'0x80'

转自:http://blog.sina.com.cn/s/blog_56a68d5501013xdd.html 我们公司旗下的红黑互联会遇到这种问题 事件类型: 警告事件来源: W3SVC事件种类: 无事件 ID: 1009日期: 事件: XX:XX:XX用户: XX计算机: XXXX描述:为应用程序池 XXXXX 提供服务的进程意外终止.进程 ID 是 XXXX.进程退出代码是 0x80.有关更多信息,请参阅在 asp">http://go.microsoft.com/fwlink/ev

调查android logcat进程退出原因

问题最终的logcat进程退出的原因是log buffer size设置过小导致,默认size为256KB, 将buffer size设置为4MB后,后面就再没有出现过logcat中断的情况: 修改的code就一行代码,但这个原因的调查过程确实不易,这里记录一二 1.测试同事在android 8.0平台版本中经常遇到logcat进程中途退出的情况, 导致抓的logcat信息不全,给分析定位问题带来不便: 2.基于出现的这种,进行分析logcat进程退出的可能性:  一,在logcat进程中断时,