bash 脚本采集 heap/thread dump

之前每次做 heap/thread dump 都要登录到对应的机器上去执行几行命令, 后来有人集成了采集 dump 功能到 slack, 每次复制机器名到 slack 就可以采集 dump 了. 不过还可以通过 slat API 去采集 dump, 只要给 salt API 一个脚本就可以了.

如果目标服务器上只有一个 Java 启动的 Tomcat 进程, 便可以这么做: 脚本如下:
#!/bin/bash
pid=$(ps -C java -o pid= | xargs)
echo ${pid}
log_dir="/proc/${pid}/cwd/logs" #tomcat 的 logs 目录
echo ${log_dir}
java_cmd=$(ls -l /proc/${pid}/exe | awk '{print $11}')
echo ${java_cmd}
java_dir=$(dirname ${java_cmd})
echo ${java_dir}
jcmd_cmd="${java_dir}/jcmd"
echo ${jcmd_cmd}
result=$(${jcmd_cmd} ${pid} Thread.print -l > ${log_dir}/thread.log)
echo ${result}

整理成一行:
thread dump:

$(dirname $(ls -l /proc/$(ps -C java -o pid= | xargs)/exe | awk '{print $11}'))/jcmd $(ps -C java -o pid= | xargs) Thread.print -l > /proc/$(ps -C java -o pid= | xargs)/cwd/logs/xiatian_thread.log

heap dump:

$(dirname $(ls -l /proc/$(ps -C java -o pid= | xargs)/exe | awk '{print $11}'))/jcmd $(ps -C java -o pid= | xargs) GC.heap_dump /proc/$(ps -C java -o pid= | xargs)/cwd/logs/xiatian_heap.log.hprof

标签: none

添加新评论