如何在 Linux 中以非 root 用户身份运行 MongoDB?

ed-*_*-ta 6 mongodb linux amazon-ec2

我可以将 MongoDB 启动为$sudo service mongod start. 当我开始时没有sudo它给我这个错误:

/etc/init.d/mongod: line 58: ulimit: open files: cannot modify limit: Operation not permitted
/etc/init.d/mongod: line 60: ulimit: max user processes: cannot modify limit: Operation not permitted
Starting mongod: runuser: may not be used by non-root users
Run Code Online (Sandbox Code Playgroud)

1)现在,我已将所有权更改为我能找到的所有 mongo 目录上的非 root 用户,即/var/lib/mongo,,,,var/log/mongodbdata/dbvar/run/mongodb

$sudo chown -R nonRootUser:nonRootUser [directory]
Run Code Online (Sandbox Code Playgroud)

2)我删除了mongod.lock文件

--repair3)我也跑过

它仍然给我同样的错误。

我也尝试过

$mongod --fork --logpath /var/log/mongodb.log

about to fork child process, waiting until server is ready for connections.
forked process: 18566
ERROR: child process failed, exited with error number 1
Run Code Online (Sandbox Code Playgroud)

mongod.log 文件这样说:

2016-03-17T15:03:49.053+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
2016-03-17T15:03:54.144+0000 I CONTROL  [signalProcessingThread] got signal 15 (Terminated), will terminate after current cmd ends
Run Code Online (Sandbox Code Playgroud)

这是亚马逊Linux。我可以像 $mongod 一样启动它,但我想将它作为守护进程运行,以便它连续运行。

nonRootUser 是我除了 ec2-user 之外创建的新用户。如果您不是 ec2 用户,也许存在一些与运行守护进程相关的配置问题?

更新:将所有内容的所有权更改为 ec2-user,但仍然遇到与以前完全相同的错误。

Pet*_*ano 5

更新

这个答案非常旧,涵盖了使用init脚本的旧版本 MongoDB。对于systemd系统,请参阅下面Wernfried Domscheit的回答。

旧答案

您提到您使用rpm安装程序在 Amazon Linux AMI 上安装 MongoDB。执行此操作时,mongod系统上会创建用户,并且所有相应的文件都会创建并归该mongod用户所有。启动由 安装的 MongoDB 时rpm,该命令必须由 运行root或使用 运行sudo。这是因为 init 脚本必须执行更改用户命令,以便mongod可以将进程分叉为用户的子进程mongod

未能使用rootsudo启动该服务会导致您上面引用的错误。

/etc/init.d/mongod: line 58: ulimit: open files: cannot modify limit: Operation not permitted
/etc/init.d/mongod: line 60: ulimit: max user processes: cannot modify limit: Operation not permitted
Starting mongod: runuser: may not be used by non-root users
Run Code Online (Sandbox Code Playgroud)

因此,为了作为服务运行,您必须使用sudorootmongod除了向用户授予 shell、为其分配密码、以该用户身份登录,然后运行服务之外,没有简单的方法可以解决此问题。这仍然会导致尝试修改时出错,ulimits并且通常不建议这样做。

要启动 MongoDB 而不将其作为服务运行,因为您使用了rpmmongod二进制文件应该位于您的路径中,因此以下内容应该有效

mongod --dbpath /path/to/data --logpath /path/to/mongod.log --fork
Run Code Online (Sandbox Code Playgroud)

请注意,执行此操作将以当前登录用户的身份运行它,这意味着所有数据文件都必须mongod.log可由该用户写入。理想情况下,这些文件应归该用户所有。


ed-*_*-ta 2

更改目录和文件的权限后,不要忘记注销并重新登录。

我仍然无法运行它

$ service mongod start
Run Code Online (Sandbox Code Playgroud)

它只能以 root 身份运行。

但您也可以将其作为守护进程运行,如下所示:

 $ mongod --fork --logpath to/logpath
Run Code Online (Sandbox Code Playgroud)

为了安全起见,我为 logpath 创建了 data/log 目录。是的,除了 ec2-user 之外,您还可以在 Amazon Linux 上创建其他用户,他们也可以运行 mongodb