2023-11-15T00:10:01.559+0800 [mongosMain] pthread_create failed: errno:11 Resource temporarily unavailable

该部分仅登录用户可见

然后通过命令将其启动

/opt/machtalk/mongo/bin/mongod --configsvr --dbpath /opt/machtalk/mongo/config/data --port 21000 --logpath /opt/machtalk/mongo/config/log/config.log --fork --keyFile /opt/machtalk/mongo/keyfile

程序运行后,一直到早上上班以为没啥问题。

后来一想,不对,凌晨4:00左右我是用的root账号启动的,但是这些程序一般是使用普通用户启动的。

上了班,大概10点钟,想着搞一下,也没有啥停止命令,而且又是分布式,直接kill得了。

然后在普通用户下执行程序,报错

该部分仅登录用户可见

about to fork child process, waiting until server is ready for connections.
forked process: 21057
ERROR: child process failed, exited with error number 1

按照网上的说法,找到了一堆lock文件,然后把config的lock文件删掉

rm ./mongodb-linux-x86_64-2.6.11/config/data/mongod.lock

还是报错。

差一点就按照一哥们写的,把config的数据目录删掉,然后同步了。
此时,我回想起一个问题。每次我在从root切换到普通用户的时候,报告/dev/null访问被拒绝。然后联想到报错信息,fork失败。难道是普通用户没有权限访问/dev/null么?

我先把fork参数去掉,直接执行是可以正常执行的,而且日常输出也正常。

然后,使用命令

chmod 666 /dev/null

更改/dev/null的权限,使得普通用户也有权限访问/dev/null。
再次加上fork参数运行,可以了。

那么,linux下面,fork进程与/dev/null有啥关系呢?

在 Linux 中,`fork` 是一个系统调用,它创建一个新的进程,这个新的进程是当前进程的一个完全独立的副本。这个新的进程被称为子进程,而创建它的进程被称为父进程。

`/dev/null` 是一个特殊的文件,通常被称为 "null device",它会丢弃所有写入它的数据,并且在读取时立即返回 EOF(End Of File,文件结束标记)。这使得 `/dev/null` 成为一个非常有用的工具,当你不关心一个程序的输出时,你可以将它的输出重定向到 `/dev/null`。

那么,`fork` 进程与 `/dev/null` 的关系是什么呢?

在创建守护进程(daemon)或后台进程时,`fork` 和 `/dev/null` 经常一起使用。守护进程是一种在后台运行的进程,它通常会从父进程中 `fork` 出一个子进程,然后让父进程退出。这样做的目的是使子进程成为孤儿进程,它将被 init 进程(进程 ID 为 1 的进程)收养,从而使得原来的父进程可以安全地结束,而不影响子进程的运行。

在这个过程中,子进程通常会关闭其所有打开的文件描述符(包括标准输入、标准输出和标准错误),并将它们重定向到 `/dev/null`。这样做的目的是避免子进程意外地读取或写入任何可能已经被父进程使用的文件或设备。同时,任何由子进程产生的输出都会被丢弃,不会干扰到任何终端或用户。

这就是 `fork` 进程与 `/dev/null` 相关联的常见场景。

那么,其他的linux主机是不是也没有权限呢,查看了另外集群的2台机器,也是rw-r--r--。

该部分仅登录用户可见

但是,查看本地deepin linux桌面确实有的。

crw-rw-rw- 1 root root 1, 3 11月 14 13:34 /dev/null

猜测运行的时候是使用了别的方法,例如

su -s xxxx /bin/xxx

有待进一步验证。

最后修改:2024 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏