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

以下是一个改进的命令,可以列出所有线程数大于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太多,如果大太多,那么有可能程序存在线程泄露的问题,更进一步可能会导致业务不可用

相关推荐
大母猴啃编程43 分钟前
Linux权限
linux·运维·服务器
为什么要内卷,摆烂不香吗1 小时前
LVS部署DR模式集群
服务器·数据库·lvs
枷锁—sha1 小时前
从零掌握XML与DTD实体:原理、XXE漏洞攻防
xml·前端·网络·chrome·web安全·网络安全
厦门辰迈智慧科技有限公司3 小时前
高速公路自动化安全监测主要内容
运维·物联网·安全·自动化
LeeZhao@3 小时前
【项目】MCP+GraphRAG搭建检索增强智能体
人工智能·chrome·语言模型·重构·开源·agi
cpsvps3 小时前
香港服务器SSH安全加固方案与密钥认证实践
服务器·安全·ssh
运维开发王义杰3 小时前
告别手动迁移:使用 PowerShell 一键导出 IIS 配置,让服务器迁移更轻松
运维·服务器·windows
阿巴~阿巴~4 小时前
深入理解Linux文件操作:stdin/stdout/stderr与C语言文件函数全解析
linux·运维·服务器
阿巴~阿巴~4 小时前
深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存
linux·运维·服务器
tan77º4 小时前
【Linux网络编程】应用层协议 - HTTP
linux·服务器·网络·c++·http·https·tcp