#!/bin/bash
############################################################################
#作者:周xx #
#日期:2020-01-20 #
#用途:该脚本旨在帮助快速收集java程序相关堆栈信息,快速恢复业务。 #
#版权:本工具版权信息归作者所有,未经授权不可用于平台外的其它商业用途。 # #
############################################################################
#
# Input variables:
# 无:不用传参
# Output variables:
# JVM_LOG_PATH: jvm快照日志本地路径
#加载脚本执行环境变量
source /etc/profile
source ~/.bash_profile
#全局变量
LOG=/tmp/log_collect$$
CSFILE=$(basename $0).txt
#默认路径
JAVA_HOME=/opt/appl/java/jdk
if [ -d $JAVA_HOME ];then
JAVA_HOME=/opt/appl/java/jdk
elif [ -d "/opt/appl/tomcat/jdk" ];then
JAVA_HOME=/opt/appl/tomcat/jdk
elif [ -d "/opt/appl/apache-tomcat-8.0.45/jdk" ];then
JAVA_HOME=/opt/appl/apache-tomcat-8.0.45/jdk
fi
#以下为方法功能函数
showusage() {
echo "用法: sh `basename $0`"
exit 1
}
jvm_info() {
time=$(date +"%Y-%m-%d %H:%M:%S")
host=$(hostname)
ip=$(/sbin/ip addr | egrep 'eth0|ens160' |awk 'NR==2 {print $2}'| sed 's#/24##g')
cpu_cores=$(cat /proc/cpuinfo | grep 'processor' |wc -l)
cpu_type=$(cat /proc/cpuinfo |egrep 'model name|cpu MHz' |head -2|awk -F: '{print $2}' | xargs -n100)MHz
memory=`echo "scale=2;$(cat /proc/meminfo | grep 'MemTotal' | awk -F: '{print $2}' | awk '{print $1}')/1024/1024"| bc`GB
max_openfiles=`ulimit -a | grep 'open files'| awk '{print $NF}'`
max_user_processes=`ulimit -a | grep 'max user processes'| awk '{print $NF}'`
#打印服务器基本信息
cat > $LOG/basic.txt <<EOF
主机名:$host
ip:$ip
cpu核数:$cpu_cores
cpu型号:$cpu_type
总内存:$memory
最大openfiles:$max_openfiles
最大用户进程数:$max_user_processes
EOF
#获取系统重要日志和重要配置
cat /etc/resolv.conf > $LOG/resolv.txt
tail -2000 /var/log/messages > $LOG/messages.txt
sysctl -a > $LOG/sysctl.txt 2>/dev/null
df -h > $LOG/disk.txt
tail -2000 /var/log/secure > $LOG/secure.txt
tail -500 /var/log/cron > $LOG/cron.txt
top -bc -n 1 > $LOG/memory.txt
netstat -anpe > $LOG/netstat.txt
netstat -s > $LOG/networks.txt
which lsof || yum -y install lsof
lsof > $LOG/openfiles.txt
ps -ef|grep java |grep '/opt/appl' |grep -v grep |egrep -v logstash > $LOG/java_process.txt
#检查
#获取java jvm信息
pids=`ps -ef|grep java |grep '/opt/appl' |grep -v grep |egrep -v logstash |awk '{print $2}'`
for pid in $pids;do
user=`ps -ef|grep java |grep $pid | grep -v grep|awk '{print $1}'`
su - $user <<EOF
mkdir -p $LOG/${pid}
export PATH=$JAVA_HOME/bin:$PATH
jstat -gcutil ${pid} > $LOG/${pid}/jstat_gcutil_$$.txt ;
jmap -histo:live ${pid} > $LOG/${pid}/jmap_histo_$$ ;
jmap -dump:live,file=$LOG/${pid}/jmap_dump_$$.bin ${pid};
jstack -l ${pid} > $LOG/${pid}/jstack_1_$$;
jstack -l ${pid} > $LOG/${pid}/jstack_2_$$ ;
EOF
done
tar_filename=log_collect_`hostname`_`date +"%Y%m%d%s"`.tar.gz
cd /tmp && tar -czvf $tar_filename log_collect$$ >/dev/null 2>&1
find $LOG -not -name "memory.txt" -not -name "basic.txt" -not -name "jstat_gcutil.$$" -exec rm -f {} \; >/dev/null 2>&1
mv ${tar_filename} $LOG
echo "JVM_LOG_PATH${LOG}JVM_LOG_PATH"
}
#主函数,具体逻辑实现
#############################
#判断参数变量,以决定是否合法
if [ $# -gt 0 ];then
showusage
fi
rm -fr /tmp/log_collect$$
mkdir -p $LOG
chmod 777 $LOG
#获取jvm信息
jvm_info
#echo "{'time':'$time','host':'','ip':'','cpu_cores':'','cpu_type':'','memory':'','max_openfiles':'','max_user_processes':'','cpu_used_percent':'','used_openfiles':'','used_memory_percent':'','disk_opt_percent':'','jvm_heapsize':'11808_1','jvm_info':'url'}"
#储存上传jvm信息
#tar_filename=log_collect_`hostname`_`date +"%Y%m%d%s"`.tar.gz
#cd /tmp && tar -czvf $tar_filename log_collect --remove-files
#curl -XPOST https://opsjvm.xxx.com/upload?token=OYFTXLUCIL3PJ5CR7ZECT7HNHM -F "data=@/tmp/$tar_filename"