我想生成一个自动线程转储。这是我正在使用的脚本。
THREADDUMP_LOG_FILE="/tmp/tmpLog_`date +"%Y%m%d%H%M%S"`"
pid=`ps axww | grep -v grep | sed -e 's/^[ ]*//g' | sed -e 's/[ ][ ]*/ /g' | cut -f1 -d' ' `
$JAVA_HOME/bin/jstack $pid >> $THREADDUMP_LOG_FILE
当我这样做时,这就是我在线程转储日志文件中看到的内容。
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
显然,我做错了什么。有人可以在这里指导我如何使用jstack进行线程转储吗?
答案 0 :(得分:1)
我没有直接回答,但我认为你为获得PID所做的shell-foo-magic可能是错误的。因此,您可以在pid = ...行之后直接添加'echo $ PID'并显示输出。 因为直接使用'jstack'对我来说很好。
答案 1 :(得分:0)
你不能给jstack提供多个pid,你应该只给它一个java进程的pid。这样的事情应该有效:
for pid in $(ps axww | grep ' java' |grep -v grep | sed -e 's/^[ ]*//g' | sed -e 's/[ ][ ]*/ /g' | cut -f1 -d' '); do
jstack $pid >> $THREADDUMP_LOG_FILE
done
或更简单:
for pid in $(jps | sed 's/^\([0-9][0-9]*\) .*$/\1/'); do
jstack $pid >> $THREADDUMP_LOG_FILE
done