查找服务器上存在线程泄露的进程

以下是一个改进的命令,可以列出所有线程数大于200的进程及其PID和线程数:

bash 复制代码
find /proc -maxdepth 1 -type d -regex '/proc/[0-9]+' -exec sh -c '
  for pid_dir do
    pid=$(basename "$pid_dir")
    if [ -f "$pid_dir/status" ]; then
      threads=$(awk "/Threads/ {print \$2}" "$pid_dir/status" 2>/dev/null)
      if [ -n "$threads" ] && [ "$threads" -gt 200 ]; then
        echo "PID: $pid, Threads: $threads"
      fi
    fi
  done
' sh {} +

命令详解:

  1. 查找所有PID目录

    bash 复制代码
    find /proc -maxdepth 1 -type d -regex '/proc/[0-9]+'
    • -maxdepth 1:只搜索/proc顶层目录
    • -type d:只匹配目录
    • -regex:正则匹配纯数字PID目录
  2. 高效处理目录

    bash 复制代码
    -exec sh -c '...' sh {} +
    • 使用find -exec +批量处理目录,比逐个处理更高效
    • 避免for i in $(ls)可能导致的空格问题
  3. 提取线程数

    bash 复制代码
    threads=$(awk "/Threads/ {print \$2}" "$pid_dir/status" 2>/dev/null)
    • 使用awk精确提取Threads行的第二个字段
    • 2>/dev/null忽略权限错误或已终止进程
  4. 条件过滤

    bash 复制代码
    if [ -n "$threads" ] && [ "$threads" -gt 200 ]; then
    • -n "$threads":确保成功获取线程数
    • -gt 200:筛选线程数大于200的进程

输出示例:

复制代码
PID: 1234, Threads: 250
PID: 5678, Threads: 312
PID: 9012, Threads: 280

优化版本(单行命令):

bash 复制代码
find /proc -maxdepth 1 -name '[0-9]*' -type d -exec awk -F: '/^Pid|^Threads/ {pid=$2; getline; if($2>200) printf "PID: %d, Threads: %d\n", pid, $2}' {}/status \; 2>/dev/null

关键改进:

  1. 避免解析ls输出 :直接使用find匹配目录,更安全可靠
  2. 高效批量处理 :使用find -exec +减少子进程创建
  3. 错误处理:忽略无法访问的进程目录
  4. 精确匹配:确保只处理有效进程状态文件
  5. 完整输出:同时显示PID和线程数

注意:某些系统进程可能无法访问(权限问题),这些会被自动忽略。

写在最后:

springboot内嵌两种Web服务器,Undertow和Tomcat,业务正常情况下线程数都不会大于200太多,如果大太多,那么有可能程序存在线程泄露的问题,更进一步可能会导致业务不可用

相关推荐
你驴我18 分钟前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
tiannian122029 分钟前
RFID资产管理系统投入产出全拆解:硬件、软件、部署、运维四笔账一次算清
运维·rfid·资产管理系统
我头发多我先学31 分钟前
Linux入门:简要认识Linux和基础指令
linux·运维·服务器
Urbano1 小时前
职业工装外套核心缝制工序自动化替代分析与多品牌设备选型报告
运维·自动化
逍遥德1 小时前
运维技术栈Linux+docker+Kubernetes+Jenkins/GitLab CI 知识点详细列表
linux·运维·docker
名字还没想好☜1 小时前
Kubernetes CrashLoopBackOff 排查全流程:从 describe 到日志到 exit code
运维·docker·云原生·容器·kubernetes
冰封之寂1 小时前
Docker 部署与基础命令详解:从安装到容器管理全流程指南
linux·运维·docker·容器
cellurw1 小时前
20260723 六组件全流程编译打通与音频项目启动
linux·服务器·音视频
隔振消音专家2 小时前
冷水机组振动传导影响及专业化减振适配治理方案
大数据·运维
Brilliantwxx2 小时前
【Linux】 软件包管理器(yum)+ Vim使用
linux·运维·服务器·开发语言·编辑器·vim