问题描述
在连接远程服务器时突然遇到fork: retry: No child processes报错,之后重新登录服务器才使用一段时间后又继续报错fork: retry: No child processes
原因分析:
1.可能是用户的线程满了导致的
2.可能是僵尸进程太多导致的
解决方案:
方案一:
使用命令ulimit -a查看
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 513124
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) unlimited
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
可以看到max user processes数为4096,
$ ulimit -u 10000
$ ulimit -u
10000
注:这种方式只能暂时修改进程数,退出服务器之后会自动更改为服务器的默认设置。
要想永久更改需要到配置文件中修改该参数,这需要在root环境下操作
# sudo vi /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
将参数4096修改为10000即可
修改进程数到10000可以暂时解决fork: retry: No child processes这个问题。但是过一段时间之后还是会出现fork: retry: No child processes的问题
方案二:
使用top命令查看僵尸进程数
$ top
查找出服务器中的僵尸进程,将其杀死。
$ ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
Z 169111 170661 [python3.8] <defunct>
Z 169111 170661 [python3.8] <defunct>
...
Z 169111 170661 [python3.8] <defunct>
Z 169111 170661 [python3.8] <defunct>
-A
:参数列出所有进程-o
:自定义输出字段,我们设定显示字段为stat(状态,ppid(父进程pid,pid(进程pid,cmd(命令行)这四个参数- 因为状态为 z 或者 Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
$ ps aux |grep 169111 |grep -v grep
user 169111 0.0 0.0 141500 9868 ? Ss 10月27 0:58 0:58 /home/user/anaconda3/envs/drugban/bin/python3.8 /home/user/.pycharm_helpers/generator3/__main__.py -d /home/user/tmp/jY36P3ZorR --init-state-file
可以看到是用户下python的执行文件,可以选择杀死这个僵尸进程
kill -HUP 169111
再重复上述操作,杀死一些无用的僵尸进程
参考文献:
linux fork: retry: 没有子进程、资源暂时不可用问题解决 - 简书 (jianshu.com)
ヾ(≧▽≦*)o欢迎回来!Linux的普通用户bash突然报错bash fork retry No child processes的解决办法 | 二丫讲梵 (eryajf.net)