mongodb进程莫名退出

本文探讨了MongoDB服务在运行过程中异常退出的问题,并详细分析了日志中出现的Hangup信号的原因。作者指出,当通过Shell启动MongoDB后直接关闭窗口而非使用exit命令时,MongoDB会接收到SIGHUP信号导致服务终止。文章最后提供了通过添加--fork参数启动MongoDB以避免此类问题的方法。

转载自:http://www.db2china.net/Article/34771


使用命令

./mongod --dbpath=../data/db/ --logpath=../data/log/mongodb.log --logappend

来启动mongodb服务后,过段时间,mongodb莫名退出了,查看log发现

2017-06-09T13:48:57.996+0800 I CONTROL  [signalProcessingThread] got signal 1 (Hangup), will terminate after current cmd ends
2017-06-09T13:48:57.996+0800 I NETWORK  [signalProcessingThread] shutdown: going to close listening sockets...
2017-06-09T13:48:57.996+0800 I NETWORK  [signalProcessingThread] closing listening socket: 7
2017-06-09T13:48:57.996+0800 I NETWORK  [signalProcessingThread] closing listening socket: 8
2017-06-09T13:48:57.996+0800 I NETWORK  [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2017-06-09T13:48:57.996+0800 I NETWORK  [signalProcessingThread] shutdown: going to flush diaglog...
2017-06-09T13:48:57.996+0800 I FTDC     [signalProcessingThread] Shutting down full-time diagnostic data capture
2017-06-09T13:48:58.000+0800 I STORAGE  [signalProcessingThread] WiredTigerKVEngine shutting down
2017-06-09T13:48:58.238+0800 I STORAGE  [signalProcessingThread] shutdown: removing fs lock...
2017-06-09T13:48:58.238+0800 I CONTROL  [signalProcessingThread] now exiting
2017-06-09T13:48:58.238+0800 I CONTROL  [signalProcessingThread] shutting down with code:0
可以看到有其他进程给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的方式执行 

这样才会使mongo进程成为系统集成(父id为1);如果不加,父id则为当前terminal;一旦退出,mongo就收到异常的信号从而退出
关于Linux的signal(信号)和bash更多内容请自行关注man bash

相关:http://ask.youkuaiyun.com/questions/179010

转载自:http://www.db2china.net/Article/34771

<think>首先,用户的问题是:“我想查找在MongoDB退出编辑的方法 请问MongoDB退出编辑的方法”。这似乎是用户在询问如何在MongoDB退出编辑模式。 回顾系统级指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式使用 $$...$$。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用段落末尾添加引用标识。 用户提供了三个引用: - 引用[1]:关于关闭MongoDB数据库的函数(db.shutdownServer() 和 db.runCommand("shutdown")),需要在admin库中执行。 - 引用[2]:描述MongoDB是什么,它是一个面向文档的NoSQL数据库。 - 引用[3]:讨论MongoDB中索引的重要性,特别是对于大数据量。 用户明确说:“上述引用仅供参考,并不是用户真正的需求”,并强调“请尽可能多的参考用户上一次的问题和你的回答”。我需要回忆用户上一次的问题和我的回答。 在对话历史中: - 用户之前的指令是关于快速排序的示例,但那是在上下文之前的系统指令示例中给出的。 - 在用户的消息中,这是第一次出现关于MongoDB的问题。用户说“用户上一次的问题”,但在这个对话中,这是第一个用户问题。可能用户指的是系统示例中的内容,但系统示例是快速排序,不是MongoDB。 查看完整的对话: - 系统指令给出了一个示例关于快速排序。 - 然后用户提供了引用和当前问题。 - 用户说“用户上一次的问题”,但在这个对话线程中,这是第一次用户输入问题。可能是个误解;我应该专注于当前问题。 用户的问题是:“请问MongoDB退出编辑的方法”。结合引用,引用[1]是关于关闭数据库的函数,不是退出编辑模式。 在MongoDB中,“退出编辑”可能指的是在MongoDB shell中退出编辑模式。MongoDB shell是一个JavaScript环境,用户可以在其中执行命令。退出编辑模式可能意味着退出shell或退出某个编辑状态。 在MongoDB shell中,用户输入命令时,如果输入多行命令,可能需要退出编辑模式。或者退出shell本身。 常见的方法是: - 在MongoDB shell中,输入`.exit`或按Ctrl+D或Ctrl+C来退出shell。 - 如果用户在使用文本编辑器或类似工具编辑查询,退出编辑可能意味着退出那个编辑器。 但用户提到“退出编辑”,可能是一个误解。引用[1]是关于关闭服务器,不是退出编辑。 用户说“参考站内引用”,但指定引用不是用户真正需求。我应该基于问题回答。 所以,核心问题:如何退出MongoDB中的编辑模式。 在MongoDB上下文中: - 如果用户是指在MongoDB shell中编辑命令时退出输入模式,在shell中,如果用户在多行输入中,可以按Ctrl+C来取消输入。 - 要在shell中退出shell本身,输入`.exit`或`.quit`或按Ctrl+D。 - 如果用户是指在MongoDB Compass或其他GUI工具中退出编辑,方法可能不同。 用户没有指定上下文,所以我应该假设是命令行shell。 标准退出方法: - 在MongoDB shell中,输入`.exit` or `.quit`。 - 或者使用`db.shutdownServer()`关闭服务器,但那更极端。 但用户的问题是“退出编辑”,而不是关闭服务器。引用[1]是关于关闭服务器,但我需要提供相关答案。 可能的误解:用户可能把“关闭服务器”误认为是“退出编辑”。但退出编辑在shell中不同。 我应该直接回答问题。 结构化回答: - 使用中文。 - 结构清晰。 - 最后生成相关问题。 - 添加引用标识,如果需要引用引用内容时。 引用内容: - [^1] 关于关闭服务器。 - [^2] 关于MongoDB介绍。 - [^3] 关于索引。 对于当前问题,引用[1]部分相关,但用户说不是真正需求。 回答建议: - 解释如何在MongoDB shell中退出编辑或退出shell。 - 例如:在MongoDB shell中,如果要退出当前编辑模式(如取消输入),按Ctrl+C;要退出shell,输入`.exit`或按Ctrl+D。 - 澄清编辑模式:在shell中,输入命令时,如果按Enter前输入错误,可以Ctrl+C取消;如果已完成命令,按Enter执行。 更准确地说: - 在MongoDB交互式shell中: - 取消当前输入:按Ctrl+C。 - 退出shell:输入`.exit`或`.quit`,或按Ctrl+D(在Unix-like系统)。 如果用户指的是其他编辑,如使用编辑器,但MongoDB shell默认没有内置编辑器;它使用行编辑器。 或许用户误解了“编辑”。引用中没有提到编辑模式。 基于问题,提供实用答案。 回答结构: 1. 引入主题。 2. 解释退出编辑模式的方法。 3. 可能提到关闭服务器如果相关,但重点在退出编辑。 4. 最后生成相关问题。 生成相关问题:基于MongoDB基本操作。 确保LaTeX正确:但问题中没有数学内容,所以可能不需要LaTeX,除非有变量。 用户可能没有数学内容,但指令说行内数学必须用$...$,所以如果有任何数学,用那个格式。 在这里,可能没有数学,所以直接回答。 最终回答大纲: - 回答:在MongoDB中,"退出编辑"可能指的是在MongoDB shell中退出当前的输入模式或退出shell本身。以下是方法... - 退出当前输入:按Ctrl+C取消输入。 - 退出shell:输入`.exit`或`.quit`命令,或按Ctrl+D(在终端)。 - 如果需要关闭服务器,引用[1]提到函数,但那不是退出编辑。 - 添加引用如果使用:[^1]对于关闭服务器,但不直接相关。 - 相关问题:如“如何启动MongoDB shell?” “如何在MongoDB中保存和退出编辑过的文档?”等。 </think>### MongoDB退出编辑的方法 在MongoDB中,"退出编辑"通常指的是在MongoDB命令行shell中退出当前输入模式或终止会话。MongoDB shell是一个交互式JavaScript环境,用于执行数据库命令。以下是常见场景下的退出方法,基于标准操作: 1. **退出当前输入模式(取消编辑中的命令)**: 当您在多行输入命令或编辑查询时(例如输入一个函数或循环),如果想放弃当前输入并返回到shell提示符: - **按 `Ctrl + C`**:这会取消当前输入行或命令,而不退出整个shell会话。这是最常用的方式来"退出编辑"状态。 - 示例:如果您正在输入 `db.collection.find()` 时发现有错误,按 `Ctrl + C` 可立即停止输入并返回shell。 2. **退出整个MongoDB shell会话**: 如果想完全结束并关闭shell连接: - **输入 `.exit` 或 `.quit` 命令**:在shell提示符下直接输入这些命令,然后按Enter键。 - **按 `Ctrl + D`**(在Unix/Linux或macOS系统中)或 `Ctrl + Z` 后按Enter(在Windows系统中),这将发送EOF(End-of-File)信号并退出shell。 - 示例:在shell中输入 `.exit` 后,会话将关闭并返回操作系统命令行。 3. **如果需要关闭MongoDB服务器(非编辑相关)**: 用户提供的引用[^1]提到了安全关闭数据库服务器的方法(例如 `db.shutdownServer()`),但这与"退出编辑"不同。它用于完全停止MongoDB服务,需要在admin库执行: ```javascript use admin db.shutdownServer() ``` 这通常在管理员维护时使用,而不是常规编辑退出[^1]。 ### 注意事项 - **上下文澄清**:如果您使用的是MongoDB图形工具(如Compass)或编辑器插件,"退出编辑"可能指取消文档编辑操作(通常通过点击"Cancel"按钮实现)。但在命令行shell中,上述方法适用。 - **安全性**:退出编辑或shell不会影响数据库状态;所有未提交的更改将被丢弃。确保在执行关键操作前保存查询或使用事务。 - **引用说明**:引用[^1]强调关闭服务器的安全方法[^1],引用[^2]介绍MongoDB的文档型特性[^2],引用[^3]讨论索引优化[^3],但都与退出编辑操作间接相关。 如果您有更多细节(如使用的工具或具体场景),我可以提供更针对性指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值