第一步获取CPU高的进程
top -b -n 1
第二部获取CPU高的线程
top -b -n 1 -p {pid} -H
打印16进制
printf "%x" {pid}
第三部获取线程堆栈
jstack -l {pid}
查看CPU最高的8个线程,并打印出来
top -b -n 1 | grep -E 'java' -A 1 | awk '{print $1, $9}' | sort -k2 -rn | head -n 1|cut -d' ' -f1| xargs -I{} top -b -n 1 -p {} -H|tail -n +8| awk '{print $1, $9}'| sort -k2 -rn|head -n 8|cut -d' ' -f1|xargs printf "%x\n"
每个一段时间获取上述信息并压缩成一个文件
#!/bin/bash
# 定义常量
INTERVAL=5 # 每隔 5 秒执行一次
COUNT=3 # 循环 3 次
# 创建临时目录
TEMP_DIR=$(mktemp -d)
# 循环执行命令
for ((i=1; i<=$COUNT; i++))
do
# 查找当前 CPU 最高的进程
top -b -n 1 > $TEMP_DIR/pid_${i}.txt
pid=$(cat $TEMP_DIR/pid_${i}.txt|grep -E 'java'| awk '{print $1, $9}' | sort -k2 -rn | head -n 1|cut -d' ' -f1)
# 查找 CPU 最高的线程
top -b -n 1 -p $pid -H > $TEMP_DIR/pid_stack_${i}.txt
# 打印16进制线程ID
cat $TEMP_DIR/pid_stack_${i}.txt|tail -n +8| awk '{print $1, $9}'| sort -k2 -rn|head -n 8|cut -d' ' -f1|xargs printf "%x\n" > $TEMP_DIR/thread_id_${i}.txt
# 打印线程堆栈
jstack -l $pid > $TEMP_DIR/stacktrace_${i}.txt
sleep ${INTERVAL}
done
# 压缩打包文件
#tar -czvf stacktraces.tar.gz $TEMP_DIR/*.txt
zip stacktraces.zip $TEMP_DIR/*.txt
# 删除临时目录
rm -rf $TEMP_DIR