Search code examples
javalinuxshelljava-threads

Shell script to take thread dump of a java process


With jstack we can take thread dump of a running java process. With top and ps -aef | grep java commands, we can identify the rogue process using most of the system resources.

So, if we use jstack <rogue pid> >> threaddump.log we can take the thread dump of the specified java process.

Now my question, is there any shell script that can identify the top java process, take process id(pid), inputs to jstack utility and take the thread dump?

I've searched online and most of the links need manual efforts of inputting process id. So, I'm just curios to know if there is any existing shell script which can avoid manual input.

Thanks in advance.


Solution

  • For me this pipe works:

    ps -eo pid,%cpu,comm | grep java |sort -nr -k2 | head -n1 | awk '{print $1}' | xargs jstack
    

    Explanation:

    ps -eo pid,%cpu,comm : prints all processes with PID CPU usage and command name

    grep java : greps all java processes

    sort -nr -k2 : sorts the result numerical reverse by the second column

    head -n1 : prints the first row

    awk '{print $1}' : prints the first column

    xargs jstack : takes the input and uses it as argument for the jstack command