tomcat的安装和自动化thread线程快照
点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!
某项目现场,经常出现CPU高的时候,这种情况发现了多次,通常是代码存在一些问题,导致CPU高,经常人工去恢复,有时又未做线程快照,无法定位到具体的问题。于是想写一个小脚本,自动去获取,下面是本次的一点尝试。
-
Server(代表tomcat instance(实例),即表现出的一个jvm进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;) -
Service(用于实现将一个或多个connector组件关联至一个engine组件;) -
Connector(接入前端用户请求;) -
Engine(Servlet实例,即servlet引擎,其内部可以有一个或多个host组件来定义站点;通常需要通过defaultHost来定义默认的虚拟主机;) -
Host(位于engine内部用于接收请求并进行相应处理的主机或虚拟主机;) -
Context(Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中一个Web应用程序;) -
Value(Value组件类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器可以建多个Value,而且Value定义的次序也决定了他们生效的次序。) -
Realm(一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许。)
Tar –zxvf jdk-8u281-linux-x64.tar.gz
java -version
export JAVA_HOME=/app/jdk1.8.0_281
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
Tar –xvf *tar.gz
sh /app/tomcat/apache-tomcat-8.5.72/bin/startup.sh
1. 实现逻辑
2. 实现脚本
#!/bin/bash
source /etc/profile
log_file="/tmp/dump.log"
script_name="thread_dump.sh"
datee=$(date +"%Y-%m-%d-%H:%M:%S")
#######DECALRE
pro_cpu_rate=10.0
ipaddr=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|grep "^1XXXX"|head -n 1)
###########################
ps axf -o "pid %cpu command"|grep java|grep -v grep > /tmp/thread_${ipaddr}_${datee}_ddl
#################################
which jstack
if [ $? -eq 0 ] ;then
function pro_cpu
{
ps axf -o "pid %cpu command"|grep java|grep -v grep|awk '{if($2>=$pro_cpu_rate) print $1}' | while read procid
do
echo $procid
done
}
function log_echo
{
typeset log_message=$1
typeset log_date=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${log_date}] [${script_name}] ${log_message}" >> $log_file
}
log_echo "start jstack thread"
for i in `pro_cpu`
do
log_echo "process num $i start"
jstack $i > /tmp/thread_${ipaddr}_${datee}_$i
log_echo "process num $i end"
sleep 5
done
function file_upload
{
ftp -n <<EOF
open XXXX
user XXXX
binary
lcd /tmp
cd thread_snapshot
prompt
mput thread*
close
bye
EOF
}
function file_delete
{
cd /tmp && rm -rf thread*
}
file_upload
file_delete
cat $log_file
else
echo 0
exit;
fi