获取占用CPU最高的线程信息

Eave 2026.06.25

获取占用CPU最高的线程信息

#!/bin/bash

# 获取进程ID
# pid=$(lsof -i:10004 | grep "LISTEN" | awk '{print $2}')

pid=$1

# 保存的文件
file=/tmp/nid/trace-$(date +%Y%m%d%H%M).txt

# jstack路径
jstack=/usr/local/java/bin/jstack


# 获取该进程的相关数据
data=$(top -b -n 1 -H -o %CPU -p $pid | head -n 8 | tail -n 1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

# 获取cpu利用率最高的线程ID
tid=$(echo $data | awk '{print $1}')
# 获取CPU的最高利用率
cpu=$(echo $data | awk '{print $9}')

# 将10进制的线程ID转换为16进制的线程ID
nid=$(printf %x $tid)

# 浮点数比较CPU利用率大于80%的才记录数据
result=$(echo "$cpu > 80" | bc -l)
if [ $result -eq 1 ]; then
    echo "CPU占用高的线程: $tid => $cpu" > $file
    echo "16进制线程ID: $tid => $nid" >> $file

    echo "PID  USER PR NI VIRT    RES    SHR S %CPU %MEM  TIME+ COMMAND" >> $file
    echo $data >> $file

    # 查找相关的线程信息并向下的50行
    $jstack $pid | grep -A 50 "0x$nid" >> $file
fi