远程登录服务器之后发现不能执行任何命令,任何命令都报『bash: fork: retry: Resource temporarily unavailable』错。
很快能确认是因为nproc的设置太低,导致帐号下打开的进程数达到了上限,bash执行命令是需要fork新进程的,所以无法执行任何命令。
问题在于服务器不能重启,有一些重要的程序还在稳定执行,肯定是有某个程序fork了过多的进程,所以当前最重要的就是能执行命令,无论是查询出肇事进程,还是kill掉一些无用进程,为执行命令挤出空间。
这个时候用上了一个最不起眼的命令就是exec,它在执行命令时不会像bash那样fork,所以命令结束该ssh会话也就结束了。
exec ps H -u xxx
查询肇事进程,这里的H就是显示出进程列表。
exec kill xxx
干掉肇事进程,一切就正常了,发现原来是mongod创建了500多个进程。
接着可以设置ulimit,把nproc设置得大一些。