jstack
espera que o ID do processo seja fornecido como um parâmetro, então você deve usar a substituição de comandos:
jstack "$(top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1)"
Você pode usar ps
para encontrar o processo, em vez de filtrar a saída de top
:
jstack "$(ps -C java -o pid --sort %cpu --no-headers | head -n 1)"
Isso usa ps
para localizar processos cujo comando corresponda a java
, exiba somente seu PID, classificado pelo uso da CPU, sem cabeçalhos e mantendo o primeiro; o resultado é dado a jstack
.
Para encontrar o ID de thread usando a maior quantidade de CPU , a saída tid
, com a opção -L
para obtenha ps
para processar encadeamentos:
ps -L -C java -o tid --sort %cpu --no-headers | head -n 2
(estou extraindo os dois primeiros porque o primeiro sempre corresponderá ao PID, que agrupa todo o uso da CPU para o processo como um todo).
Você pode usar printf
para gerar isso em hexadecimal:
printf "%x\n" $(ps -L -C java -o tid --sort %cpu --no-headers | head -n 2)