当前位置: 首页 > news >正文

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

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

find /proc -maxdepth 1 -type d -regex '/proc/[0-9]+' -exec sh -c 'for pid_dir dopid=$(basename "$pid_dir")if [ -f "$pid_dir/status" ]; thenthreads=$(awk "/Threads/ {print \$2}" "$pid_dir/status" 2>/dev/null)if [ -n "$threads" ] && [ "$threads" -gt 200 ]; thenecho "PID: $pid, Threads: $threads"fifidone
' sh {} +

命令详解:

  1. 查找所有PID目录

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

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

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

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

输出示例:

PID: 1234, Threads: 250
PID: 5678, Threads: 312
PID: 9012, Threads: 280

优化版本(单行命令):

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太多,如果大太多,那么有可能程序存在线程泄露的问题,更进一步可能会导致业务不可用

http://www.lryc.cn/news/592701.html

相关文章:

  • 【c++】STL-容器 list 的实现
  • 【leetcode】3201. 找出有效子序列的最大长度(1)
  • C++ -- STL-- stack and queue
  • Python基础④-装饰器、迭代器及常用函数篇
  • [Linux]如何設置靜態IP位址?
  • setTimeout、setInterval、requestAnimationFrame的使用以及区别
  • LeetCode1047删除字符串中的所有相邻重复项
  • Kubernetes Pod深度理解
  • 20250718-6-Kubernetes 调度-Pod对象:环境变量,初始容器,静态_笔记
  • LLM(Large Language Model)大规模语言模型浅析
  • 【c++】中也有floor函数吗?他与JavaScript中的floor有啥区别?
  • RPC 与 Feign 的区别笔记
  • Nestjs框架: 基于TypeORM的多租户功能集成
  • Java全栈面试实录:从Spring Boot到AI大模型的深度解析
  • 北斗网格位置码详解:经纬度到二维网格码的转换(非极地)
  • 智能点餐推荐网站,解决选择困难
  • Honeywell霍尼韦尔DV-10 变速器放大器 输入 15-28 VDC,输出 +/- 10VDC 060-6881-02
  • 数字化转型:概念性名词浅谈(第三十讲)
  • GaussDB join 连接的用法
  • 工业互联网六大安全挑战的密码“解法”
  • 聊聊 RocketMQ 4.X 知识体系
  • 【Linux】基本指令(入门篇)(上)
  • 人工智能day9——模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • Docker部署前后端分离项目——多项目共享环境部署
  • Android sdk 升级 34到35
  • 计算机“十万个为什么”之跨域
  • c语言笔记---结构体
  • 一个简单的带TTL的LRU的C++实现
  • windows终端美化(原生配置+Oh My Posh主题美化)
  • 数据交易“命门”:删除权与收益分配的暗战漩涡