jstack.sh

2020年4月11日 作者 刘剑

#!/bin/bash
#------------------------------------------
# @Author: LJ, @Date: 2019/8/29 10:04
# @Description: 根据top查看进程并 jstack cpu消耗的进程
# 要在crontab中运行, 则命令要加完全路径
#------------------------------------------

#定义日志名称和路径
local_ip=/sbin/ip addr |grep inet|grep -v 127.0.0.1|grep -v inet6 | head -1 | awk '{print $2}' | awk -F "/" '{print $1}'
currentTime=$(date "+%Y-%m-%d-%H-%M-%S")
jstackLogFile=${currentTime}_${local_ip}.log

echo "日志文件 $jstackLogFile"

# ps 与 top 有差距,这里选择top,查看瞬时数据
# topProcess=ps -aux | sort -k3,3nr |grep java |head -1
topProcess=top -b -c -n1 |grep java | sort -k9,9nr |head -1

echo $topProcess

#获取进程号
topPid=echo $topProcess |awk '{print $1}'
#获取进程CPU数
cpuPercent=echo $topProcess |awk '{print $9}'

echo $cpuPercent

echo -e "\n================================================获取最大CPU消耗进程================================================" >> $jstackLogFile
#top显示信息不完整,这里又用回ps
echo "top 命令信息:"
echo $topProcess >> $jstackLogFile
echo "ps 命令信息:"
echo ps -aux |grep $topPid |grep -v grep >> $jstackLogFile

echo -e "\n================================================获取进程${topPid}的线程栈================================================" >> $jstackLogFile
# 要在crontab中运行, 则命令要加完全路径
jstack $topPid >> $jstackLogFile

echo -e "\n================================================获取进程${topPid}的线程================================================" >> $jstackLogFile

top -b -n2 -H -p $topPid >> $jstackLogFile