1、java進程dump腳本

1. 腳本目的

當java(tomcat)進程還存在,但是無法處理任何請求,如假死、沒有任何響應等時候,執行dump.sh腳本,快照當前系統及jvm的信息。

2. dump.sh腳本

碼雲地址

#!/usr/bin/env bash
declare SNAPSHOT_BASE_DIRECTORY=$1
declare JAVA_HOME=$2
declare PID=$3

# remove the last '/' char
set JAVA_HOME=${JAVA_HOME/%\//}
set SNAPSHOT_BASE_DIRECTORY=${SNAPSHOT_BASE_DIRECTORY/%\//}

declare FULL_TIME_FORMAT="+%Y-%m-%d_%H_%M_%S_%N"
declare SHORT_TIME_FORMAT="+%H-%M-%S-%N"
declare TIMESTAMP=`date ""${FULL_TIME_FORMAT}"" `
declare RESULT_DIRECTORY=${SNAPSHOT_BASE_DIRECTORY}/${TIMESTAMP}
declare RUN_LOG_PATH="${RESULT_DIRECTORY}/run.log"


run_log(){
	declare log_msg="$(date ""${FULL_TIME_FORMAT}""): $1"
	echo ${log_msg}
	echo ${log_msg} >>${RUN_LOG_PATH}
}

echo_blank_line(){
	echo 
}

is_no_null(){
	if [ -z $1 ];then
		return 0;
	else
		return 1;
	fi
}

is_valid_number(){
	is_no_null $1
	if [ $? -eq 0 ];then
		return 0;
	fi

	if [ $1 -gt 0 ] 2>/dev/null ;then
		return 1;
	else
		return 0;
	fi
}

valid_param(){
    is_no_null ${SNAPSHOT_BASE_DIRECTORY}
	if [ $? -eq 0 ];then
		echo "Param 1 SNAPSHOT_BASE_DIRECTORY is no exist and exit"
		exit 1;
	else
		echo "tip: SNAPSHOT_BASE_DIRECTORY=${SNAPSHOT_BASE_DIRECTORY}"
	fi

    if [ ! -d ${RESULT_DIRECTORY} ]; then
        mkdir -p ${RESULT_DIRECTORY}
        run_log "tip: Create RESULT_DIRECTORY=${RESULT_DIRECTORY}"
    fi
	echo "tip: RESULT_DIRECTORY=${RESULT_DIRECTORY}"

    if [ -d "${JAVA_HOME}" ];then
		run_log "tip: JAVA HOME: ${JAVA_HOME}"
	else
	    run_log "Param2 JAVA_HOME is no exist and exit"
		exit 2;
	fi

	is_valid_number ${PID}
	if [ $? -eq 0 ];then
		run_log "Param3 PID is invalid and exit"
		exit 3;
	fi
}
valid_param
echo "RESULT_DIRECTORY=${RESULT_DIRECTORY}"

machine_dump(){
    declare filename=$1;
    type $1 >/dev/null 2>&1 && {
        run_log "Start $1 $2 dump"
        declare timestamp=$(date ""${SHORT_TIME_FORMAT}"");
        run_log "Execute $1 $2 >> ${RESULT_DIRECTORY}/machine_${filename}_${timestamp}.dump"
        $1 $2 >> ${RESULT_DIRECTORY}/machine_${filename}_${timestamp}.dump
        run_log "End $1 $2 dump"
		echo_blank_line
    }
}

# 3 times interval 1s
declare machine_static_frequency="1 3"

# machine real time statistics information
machine_dump uptime
machine_dump free -glt
machine_dump vmstat "-t ${machine_static_frequency}"
machine_dump mpstat "-A ${machine_static_frequency}"
machine_dump iostat "${machine_static_frequency}"
machine_dump netstat "-an"
machine_dump lsof "-p ${PID}"

# machine history statistics information
machine_dump sar -A

jvm_dump(){
    declare filename;
    if [ ! -z $3 ];then
		filename=$3
	else
		filename=$1
	fi
	run_log "Start $1 $2 dump"
	declare timestamp=$(date ""${SHORT_TIME_FORMAT}"");
    run_log "${JAVA_HOME}/bin/$1 $2 >> ${RESULT_DIRECTORY}/jvm_${filename}_${timestamp}.dump"
    ${JAVA_HOME}/bin/$1 $2 >> ${RESULT_DIRECTORY}/jvm_${filename}_${timestamp}.dump
    run_log "End $1 $2 dump"
	echo_blank_line
}

# 8 times interval 1s
declare jvm_static_frequency="1000 8"

# jvm real time statistics information
jvm_dump jinfo "${PID}"
# topH have must together with jstack
machine_dump top "-H -b -n 1 -p  ${PID}" "topH"
jvm_dump jstack "-F ${PID}"
jvm_dump jstack "-F -l ${PID}" "jstack-deadlock"
jvm_dump jstat "-gcutil ${PID} ${jvm_static_frequency}" "jstat-gcutil"
jvm_dump jstat "-gccapacity ${PID} ${jvm_static_frequency}" "jstat-gccapacity"
jvm_dump jmap "-F -heap ${PID}" "jmap-heap"
jvm_dump jmap "-F -histo ${PID}" "jmap-histo"

# statistics all kinds of tcp status
cat ${RESULT_DIRECTORY}/machine_netstat*.dump  | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' > ${RESULT_DIRECTORY}/machine_netstat_status_statistics.dump

3. 執行demo

# 正常執行
/data/sh/dump.sh /data/rigger /usr/local/java/jdk1.8.0_05 16751
# 調試執行
bash -x /data/sh/dump.sh /data/rigger /usr/local/java/jdk1.8.0_05 16751
  • 參數說明

參數 | 說明 -- | -- /data/sh/dump.sh | dump腳本的絕對路徑 /data/rigger | dump文件保存的根路徑,注意,會在該路徑下在生成時間戳文件夾【注意】:rigger後面別+/ /usr/local/java/jdk1.8.0_05 | java_home路徑,【注意】:jdk1.8.0_05後面別+/ 16751 | java(tomcat)-pid

4. 執行結果

[root@chow rigger]$ ll
total 4
drwxr-xr-x 2 root root 4096 Mar 31 15:34 2017-03-31_15-31-33-801995527
[root@chow rigger]$ cd 2017-03-31_15-31-33-801995527/
[root@chow 2017-03-31_15-31-33-801995527]$ ll
total 1108
-rw-r--r-- 1 root root   8617 Mar 31 15:31 jvm_jinfo_15-31-38-646484941.dump
-rw-r--r-- 1 root root   1688 Mar 31 15:33 jvm_jmap-heap_15-33-26-169241399.dump
-rw-r--r-- 1 root root 224388 Mar 31 15:34 jvm_jmap-histo_15-33-31-900738428.dump
-rw-r--r-- 1 root root  36390 Mar 31 15:31 jvm_jstack_15-31-41-120341421.dump
-rw-r--r-- 1 root root  38276 Mar 31 15:33 jvm_jstack-deadlock_15-31-43-547938349.dump
-rw-r--r-- 1 root root   1481 Mar 31 15:33 jvm_jstat-gccapacity_15-33-18-916960208.dump
-rw-r--r-- 1 root root    738 Mar 31 15:33 jvm_jstat-gcutil_15-33-11-650829600.dump
-rw-r--r-- 1 root root    353 Mar 31 15:31 machine_free_15-31-33-825915457.dump
-rw-r--r-- 1 root root   1055 Mar 31 15:31 machine_iostat_15-31-35-878499063.dump
-rw-r--r-- 1 root root  16243 Mar 31 15:31 machine_lsof_15-31-38-316510021.dump
-rw-r--r-- 1 root root  24546 Mar 31 15:31 machine_mpstat_15-31-35-851353492.dump
-rw-r--r-- 1 root root 175841 Mar 31 15:31 machine_netstat_15-31-37-893697066.dump
-rw-r--r-- 1 root root      0 Mar 31 15:34 machine_netstat_status_statistics.dump
-rw-r--r-- 1 root root 547932 Mar 31 15:31 machine_sar_15-31-38-566908017.dump
-rw-r--r-- 1 root root  15704 Mar 31 15:31 machine_topH_15-31-40-596637210.dump
-rw-r--r-- 1 root root     72 Mar 31 15:31 machine_uptime_15-31-33-814570794.dump
-rw-r--r-- 1 root root    507 Mar 31 15:31 machine_vmstat_15-31-33-836673013.dump
-rw-r--r-- 1 root root   4439 Mar 31 15:34 run.log

5. 腳本說明

  • 腳本快照信息,主要包含兩部分:機器信息和jvm信息
    • 機器信息,包含:)實時信息和歷史信息[sar],部分實時信息會截取執行腳本時候的3次快照信息,間隔爲1s;最後會統計下tcp的各種狀態數量。
    • jvm信息,含jinfo[jvm配置信息]、jstack[線程及死鎖]、jstat[實時jvm垃圾回收信息]及jmap[堆及堆中對象信息]。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章