Shell 脚本获取 java 进程的线程转储
Shell script to take thread dump of a java process
使用 jstack
我们可以获取 运行 java 进程的线程转储。使用 top
和 ps -aef | grep java
命令,我们可以识别使用大部分系统资源的流氓进程。
因此,如果我们使用 jstack <rogue pid> >> threaddump.log
,我们可以获取指定 java 进程的线程转储。
现在我的问题是,是否有任何 shell 脚本可以识别顶级 java 进程、获取进程 ID(pid)、输入到 jstack
实用程序并获取线程转储?
我在网上搜索过,大部分链接都需要手动输入进程号。所以,我只是想知道是否有任何现有的 shell 脚本可以避免手动输入。
提前致谢。
对我来说,这条管道有效:
ps -eo pid,%cpu,comm | grep java |sort -nr -k2 | head -n1 | awk '{print }' | xargs jstack
说明:
ps -eo pid,%cpu,comm : 打印所有 PID CPU 用法和命令名称
的进程
grep java : greps 所有 java 进程
sort -nr -k2 : 按第二列倒序排列结果数值
head -n1 : 打印第一行
awk '{print $1}' : 打印第一列
xargs jstack : 获取输入并将其用作 jstack 命令的参数
使用 jstack
我们可以获取 运行 java 进程的线程转储。使用 top
和 ps -aef | grep java
命令,我们可以识别使用大部分系统资源的流氓进程。
因此,如果我们使用 jstack <rogue pid> >> threaddump.log
,我们可以获取指定 java 进程的线程转储。
现在我的问题是,是否有任何 shell 脚本可以识别顶级 java 进程、获取进程 ID(pid)、输入到 jstack
实用程序并获取线程转储?
我在网上搜索过,大部分链接都需要手动输入进程号。所以,我只是想知道是否有任何现有的 shell 脚本可以避免手动输入。
提前致谢。
对我来说,这条管道有效:
ps -eo pid,%cpu,comm | grep java |sort -nr -k2 | head -n1 | awk '{print }' | xargs jstack
说明:
ps -eo pid,%cpu,comm : 打印所有 PID CPU 用法和命令名称
的进程grep java : greps 所有 java 进程
sort -nr -k2 : 按第二列倒序排列结果数值
head -n1 : 打印第一行
awk '{print $1}' : 打印第一列
xargs jstack : 获取输入并将其用作 jstack 命令的参数