MongoDB服务启动退出,退出码为100。

41

问题

我的Mongo服务无法再次启动:

root@machine ~ # service mongod start
root@machine ~ # service mongod status
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Tue 2017-08-15 12:03:51 CEST; 2s ago
     Docs: https://docs.mongodb.org/manual
  Process: 26942 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=100)
 Main PID: 26942 (code=exited, status=100)

Aug 15 12:03:50 machine systemd[1]: Started High-performance, schema-free document-oriented database.
Aug 15 12:03:51 machine systemd[1]: mongod.service: Main process exited, code=exited, status=100/n/a
Aug 15 12:03:51 machine systemd[1]: mongod.service: Unit entered failed state.
Aug 15 12:03:51 machine systemd[1]: mongod.service: Failed with result 'exit-code'.

当进程抛出未捕获的异常时,mongod 返回退出代码100。

我做了什么

首先按照官方指南在Ubuntu 16.04.2 LTS上安装了MongoDB(版本为3.4.7)。

启动和停止服务都没有问题。因此,我继续按照官方指南启用身份验证。

然后我添加了该服务,以便可以在服务器启动时运行

root@machine ~ # systemctl enable mongod.service

mongod.conf

我也编辑了我的配置文件,通过了一个YAML linter:

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

#  engine: mmapv1
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


#processManagement:

security:
  authorization: enabled

文件的所有权是

root@machine ~ # ls -la /etc/ | grep mongo
-rw-r--r--   1 root  root     599 Aug 15 11:42 mongod.conf

DbPath

我知道dbpath存在问题,所以这是/var/lib/mongodb的所有权情况:

root@ machine ~ # ls -la /var/lib/ | grep mongo
drwxr-xr-x  4 mongodb      mongodb      4096 Aug 15 11:54 mongodb

服务列表

当通过service --status-all列出所有服务时,没有任何与Mongo相关的服务条目。

有人知道是什么原因导致了这个问题吗?


更新

如建议所述,我运行了以下命令(稍作修改):

root@machine ~ /usr/bin/mongod --verbose --config /etc/mongod.conf &
[1] 28495

当我做得正确时,这是对二进制文件的直接执行。现在这允许我至少登录到mongo shell:

root@machine ~ # mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
> 

然而,服务状态仍为失败,退出代码为100。


更新 更新

当输入root@machine ~ # /usr/bin/mongod --verbose时,我收到以下错误:

2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] MongoDB starting : pid=28642 port=27017 dbpath=/data/db 64-bit host=machine
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] db version v3.4.7
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] git version: cf38c1b8a0a8dca4a11737581beafef4fe120bcd
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] allocator: tcmalloc
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] modules: none
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] build environment:
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten]     distmod: ubuntu1604
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten]     distarch: x86_64
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten]     target_arch: x86_64
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] options: { systemLog: { verbosity: 1 } }
2017-08-15T13:45:40.973+0200 D -        [initandlisten] User Assertion: 29:Data directory /data/db not found. src/mongo/db/service_context_d.cpp 98
2017-08-15T13:45:40.973+0200 I STORAGE  [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating
2017-08-15T13:45:40.973+0200 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2017-08-15T13:45:40.973+0200 I NETWORK  [initandlisten] shutdown: going to flush diaglog...
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] now exiting
2017-08-15T13:45:40.973+0200 I CONTROL  [initandlisten] shutting down with code:100

通过终端启动服务 /usr/bin/mongod --config /etc/mongodb.conf,看看有什么错误提示? - Tarun Lalwani
我更新了我的描述。 - Jankapunkt
我没有看到任何更新错误?我不想看到服务状态,我希望你在普通终端中运行它进行检查。 - Tarun Lalwani
运行命令时没有错误,只有 PID 被打印出来 [1] 28495 - Jankapunkt
好的,请尝试使用 /usr/bin/mongod --verbose 命令,不要传递配置文件并且不要加上 & 符号,同时请检查 /var/log/mongodb/mongod.log 文件的内容。 - Tarun Lalwani
7个回答

111

如果您使用终端启动mongod,则可能仍然会出现数据目录权限方面的一些问题。我发现当您从终端运行时,数据文件是在root而不是mongodb用户下创建的。要解决这个问题......

sudo chown -R mongodb:mongodb /var/lib/mongodb/*

谢谢,我会接受它作为答案,但是我无法再确认了,因为我已经在更新的Ubuntu 16.04 LTS上安装了Mongo 3.6。 - Jankapunkt
7
谢谢!对我也有用。还需要运行sudo chown -R mongodb:mongodb /var/lib/mongodb命令。在执行此命令之前,我一直遇到“mongod.service: Failed with result 'core-dump'.”的错误提示。 - user993683
这也适用于Mongo版本2.6吗? - indefinite
1
在计算机编程中,像 sudo chown -R mongodb:mongodb * 这样的命令是非常糟糕的做法。你只需要一个符号或者一个命令就可能会搞砸操作系统的权限。因此,我们应该始终使用完整路径来递归地更改目录的权限。 - Magnus
对我来说,我正在运行mongodb -auth以进行一些用户密码调整,这导致了这个问题。自己注意,在认证之后进行chown操作。 - Shogo Yahagi

15
rm /var/lib/mongodb/mongod.lock
systemctl restart mongod
systemctl status mongod

试试这个!


2
你能详细说明一下它实际上是做什么的吗? - jotaen
锁定文件用于防止其他进程或程序在文件正在使用或被修改时写入文件或访问资源。这是一种保护措施,以防止发生冲突或损坏。理想情况下,这些文件应该在进程退出时被删除,但是如果它被不正常地终止,这些文件可能不会被删除,这使得当您尝试启动服务时它看起来仍在使用中。注意:因此,在删除锁定文件时,您必须始终极度谨慎,以确保它实际上没有被另一个进程使用。 - Mike

1

删除 'dbath' 文件夹下的 mongod.lock 文件,然后它就可以正常启动了。


1
我知道现在已经很晚了,但或许这会对有需要的人有所帮助。
我检查了 /var/log/mongodb 并发现了以下内容:
Failed to unlink socket file /tmp/mongodb-27017.sock Operation not permitted

我猜测权限是设置为root而不是mongodb,因为我使用sudo启动mongod。(也许有人可以帮助澄清这一点)
所以解决方案是删除那个/tmp/mongodb-27017.sock并重新启动服务。至少对我来说有效。(抱歉我的英语不好)

https://mkyong.com/mongodb/mongodb-failed-to-unlink-socket-file-tmpmongodb-27017/


0

检查 dbath 上的日志文件。通常位于 /var/log/mongodb 日志文件名为 mongodb.log

我的问题是磁盘空间不足... 我遇到了与你相同的错误信息。

由于磁盘没有空余空间,因此我在文件 /etc/mongodb.conf 中使用了 smallfiles 选项。 只需在此配置文件中添加以下行: smallfiles = true


0

我在 Windows 桌面上使用 mongoDB,所以

请以管理员身份启动它

或者

从管理员命令提示符中启动。

然后检查它是否已经启动))))))

这很重要

因为如果您尝试两次启动它,它也会给您

退出代码 100

也许您应该检查一下启动参数。

我的启动器:

"C:\Program Files\MongoDB\Server\5.0\bin\mongod.exe" --dbpath "C:\Program Files\MongoDB\Server\5.0\data" --auth 

-1

如果您使用的是Windows系统,只需按照以下简单步骤即可开始。

  1. 进入C盘
  2. 创建一个名为"data"的文件夹
  3. 进入新建的"data"文件夹并创建另一个名为"db"的文件夹
  4. 关闭窗口并刷新
  5. 问题已解决

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接