MongoDB 3.0 中的“无法取消链接套接字文件”错误

'Failed to unlink socket file" error in MongoDB 3.0

我是 MongoDB 的新手。我正在尝试在 Ubuntu 13.0 LTS 上安装 MongoDb 3.0,它是 Windows 7 主机上的虚拟机。我已成功安装 MongoDB(软件包等),但是当我执行命令 sudo service mongod start 时,我在“/var/log/mongodb/mongod.log”日志文件中收到以下错误。谁能帮我理解这个错误。互联网上没有与此相关的内容。

2015-04-23T00:12:00.876-0400 I CONTROL ***** SERVER RESTARTED ***** 2015-04-23T00:12:00.931-0400 E NETWORK [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock errno:1 Operation not permitted 2015-04-23T00:12:00.931-0400 I - [initandlisten] Fatal Assertion 28578 2015-04-23T00:12:00.931-0400 I - [initandlisten]

我已经通过删除 mongodb-27017.sock 文件自行解决了这个问题。我 运行 删除此文件后的服务,效果很好。但是,我仍然不确定问题的根本原因。命令 ls - lat /tmp/mongodb-27017.sock 的输出现在是

srwx------ 1 mongodb nogroup 0 Apr 23 06:24 /tmp/mongodb-27017.sock

替代KurioZ7提供的答案,您可以简单地将.sock文件的权限设置为当前用户:

sudo chown `whoami` /tmp/mongodb-27017.sock

如果我想在没有 sudo 的情况下 运行 mongod,这对我有用。如果我像 KurioZ7 的回答中那样删除文件,下次我重新启动机器时,我只会得到同样的错误。

最可能的原因是 mongod 进程在某个时候由 root 用户启动。因此,套接字文件 (/tmp/mongodb-27017.sock) 归 root 用户所有。 mongod 进程通常在它自己的专用用户下运行,而该用户没有删除该文件的权限。

如您所知,解决方案是将其删除。然后 mongodb 能够使用正确的权限重新创建它。只要 mongodb 使用 init 脚本或在正确的用户帐户下启动,这在重新启动后应该会持续存在。

对于基于 UNIX 的操作系统,作为 Bastronaut 提供的答案的替代方案,您还可以指定要保存的 .sock 文件到 mongod 具有完全用户权限的文件夹(对应于您的方式) 运行ning mongod),这样 mongod 也可以在关机时删除 .sock 文件。保存 .sock 文件的默认文件夹是“/tmp”。要指定另一个文件夹,请使用自定义 mongodb 配置文件,例如 'mongodb.conf',并向其中添加以下内容:

net:
  unixDomainSocket:
    pathPrefix: "anotherFolder"

之后你可以 运行 mongod 使用命令:

$ mongod --config /path/to/mongodb.conf

您可以阅读以下文档:https://docs.mongodb.org/manual/reference/configuration-options/#net.unixDomainSocket.pathPrefix

$ sudo mongod

它解决了我的问题

使用命令

时会出现此问题
mongod

使用命令前

sudo service mongod start

要解决此问题,可以:

对文件设置适当的权限:

/tmp/mongodb-27017.sock

删除文件

/tmp/mongodb-27017.sock

运行

sudo service mongod start && mongod

更改 /tmp 目录中的所有权 mongodb-27017.sock 文件并再次启动 mongod。

cd /tmp

sudo chown mongodb:mongodb mongodb-27017.sock
sudo systemctl start mongod

重启后手动重启 mongod 服务修复了问题。

长期解决方案 是添加静态主机名,而不是 mongod.conf 文件的 IP 地址 'net' 部分(我怀疑问题在于当 mongod 服务启动时,ip 地址尚未提供给服务器。

如果您在使用 docker 时遇到这个问题,请参考这个问题:

MongoDB docker 容器“无法取消链接套接字文件”