获取占用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