Linux的普通用户bash突然报错bash fork retry No child processes的解决办法
文章发布较早,内容可能过时,阅读注意甄别。
在普通用户下,突然 bash 失灵,无论执行什么命令,都报如下问题:
bash: fork: retry: No child processes
1
上面这段错误提示的本质是 Linux 操作系统无法创建更多进程,导致出错。 因此要解决这个问题需要修改 Linux 允许创建更多的进程。
#并发连接数
echo -e "root soft nofile 65535\nroot hard nofile 65535\n* soft nofile 65535\n* hard nofile 65535\n" >> /etc/security/limits.conf
sed -i 's#4096#65535#g' /etc/security/limits.d/20-nproc.conf
1
2
3
2
3
一个是修改最大文件打开数,一个是最大进程数,这两个数可适当酌情调大。其中 root 表示管理员,* 表示普通用户。
如果如上优化已经进行过了,而服务器仍旧还会报上边那句话,那就有可能是僵尸进程的确把系统可用进程给耗完了。
这时,使用top命令
能够看到系统中的僵尸进程数:
top - 08:21:10 up 286 days, 8:30, 1 user, load average: 0.01, 0.05, 0.05
Tasks: 493 total, 1 running, 289 sleeping, 0 stopped, 27386 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3881904 total, 216408 free, 1170100 used, 2495396 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2366900 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
581 root 20 0 568400 23276 2768 S 0.3 0.6 131:13.99 containerd
11458 root 20 0 156012 2636 1524 R 0.3 0.1 0:00.20 top
18150 root 20 0 164564 9436 2044 S 0.3 0.2 0:44.44 barad_agent
18151 root 20 0 609312 12680 2364 S 0.3 0.3 4:20.32 barad_agent
21213 root 20 0 129540 14860 5508 S 0.3 0.4 3:43.59 athens-proxy
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
其中有一项信息是 27386 zombie
,意味着系统中出现了将近三万个僵尸进程。
使用如下命令能够看到这些僵尸进程,以及它的父进程:
$ ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
Z 21213 630 [git-remote-http] <defunct>
Z 21213 633 [git-remote-http] <defunct>
Z 21213 714 [git-remote-http] <defunct>
........
Z 21213 734 [git-remote-http] <defunct>
Z 21213 741 [git-remote-http] <defunct>
Z 21213 978 [git-remote-http] <defunct>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
-A
:参数列出所有进程-o
:自定义输出字段,我们设定显示字段为 stat(状态,ppid(父进程 pid,pid(进程 pid,cmd(命令行)这四个参数- 因为状态为 z 或者 Z 的进程为僵尸进程,所以我们使用 grep 抓取 stat 状态为 zZ 进程
可以看到后边都是僵尸进程,而前边 pid 为 21213
的进程则是这些僵尸进程的父进程。
我们可以先看下这个进程是什么服务:
$ ps aux |grep 21213 |grep -v grep
root 21213 0.3 0.4 129540 16880 ? Ssl Aug31 3:45 athens-proxy -config_file=/config/config.toml
1
2
2
原来是 Athens 这个代理服务,从官方 github 搜索相关 issue,早期版本中的确存在这个问题:issue (opens new window)
我们使用的正式 v0.3 这样的早期版本,目前的处理方式有两种,一种是直接升级代理的版本,但是据了解不同版本之间参数不一样,似乎升级起来并不轻松,另一种就是干掉这个父进程:
kill -HUP 21213
1
当我执行完如上命令之后,可以发现僵尸进程数变成了 0:
Tasks: 284 total, 1 running, 283 sleeping, 0 stopped, 0 zombie
1
然后系统也不会再报上边那个错误了。
上次更新: 2024/12/05, 21:39:23