小于博客 小于博客
首页
  • Java学习笔记
  • Docker专区
  • 实战教程
  • Shell
  • 内存数据库
  • Vue学习笔记
  • Nginx
  • Php
  • CentOS
  • Docker
  • Gitlab
  • GitHub
  • MySql
  • MongoDB
  • OpenVPN
  • 配置文件详解
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 电影音乐
  • 效率工具
  • 博客相关
  • 最佳实践
  • 迎刃而解
  • 学习周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

小于博客

行者常至,为者常成
首页
  • Java学习笔记
  • Docker专区
  • 实战教程
  • Shell
  • 内存数据库
  • Vue学习笔记
  • Nginx
  • Php
  • CentOS
  • Docker
  • Gitlab
  • GitHub
  • MySql
  • MongoDB
  • OpenVPN
  • 配置文件详解
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 电影音乐
  • 效率工具
  • 博客相关
  • 最佳实践
  • 迎刃而解
  • 学习周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 最佳实践

  • 迎刃而解

    • 记一次关于tomcat的踩坑的经历
    • 解决VNC连接闪退的问题
    • 一次升级线上服务器内核的经历
    • 服务器存储不够了之直接挂载一块儿新磁盘的操作
    • 服务器存储不够了之在原逻辑卷上扩容的操作
    • 解决php-fpm启动之后没有9000端口的问题
    • 解决MySQL问题:Got error 28 from storage engine
    • 解决git clone报错Peer’s Certificate has expired的问题
    • Linux的普通用户bash突然报错bash fork retry No child processes的解决办法
    • 分析解决脚本执行时总是报出command not found
    • confluence数据目录满了
    • 利用prlimit动态修改应用进程的最大文件打开数
    • vim复制代码包含注释时格式会乱掉解决办法
    • python如何快速迁移依赖库
    • YUM安装提示--skip-broken-to-work-around-the-problem
    • 请求nginx返回413的错误
    • Linux系统环境变量被覆盖所有命令找不到怎么办
    • Centos7更改yum源为阿里云
    • node编译报错
    • git-commit错了如何更改
    • 关于执行journalctl时的一个报错
    • yum安装epel之后报错
    • umount卸载磁盘的时候提示busy
    • pip安装依赖时报ssl的问题
    • lavel框架缓存目录的问题
    • Debian系统中执行shell报错unexpected operator
    • Vuepress项目编译时报routines的错误
    • 一次因为Mac系统升级引发的ssh无法免密登陆的问题
  • 学习周刊

  • 积累
  • 迎刃而解
小于博客
2018-12-05

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

一个是修改最大文件打开数,一个是最大进程数,这两个数可适当酌情调大。其中 root 表示管理员,* 表示普通用户。

image

如果如上优化已经进行过了,而服务器仍旧还会报上边那句话,那就有可能是僵尸进程的确把系统可用进程给耗完了。

这时,使用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

其中有一项信息是 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
  • -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

原来是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/02/28, 13:00:35

← 解决git clone报错Peer’s Certificate has expired的问题 分析解决脚本执行时总是报出command not found→

最近更新
01
SpringBoot 快速实现 api 加密!
03-21
02
SpringBoot整合SQLite
03-07
03
SpringBoot配置使用H2数据库的简单教程
02-21
更多文章>
Theme by Vdoing | Copyright © 2017-2024 | 点击查看十年之约 | 豫ICP备2022014539号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式