Piping PID no jstack

0

Eu escrevi uma linha de comando que efetivamente extrai o mais alto processo de thread PID java da CPU do topo -H (código de exemplo):

top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1

Eu quero inspecionar o PID no jstack. Devido à rapidez com que os threads aparecem e desaparecem, não é possível inserir o PID manualmente, e eu esperava canalizar o resultado diretamente para o jstack, mas sempre que um faz, por exemplo (exemplo de código mais simples que reproduz o problema):

12345 | jstack

O jstack simplesmente exibe a página de ajuda do uso, como se o pipe não estivesse enviando a variável para o jstack.

Como posso obter o PID que recebi com meu comando no jstack?

    
por SSight3 24.10.2018 / 15:18

1 resposta

4

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)
    
por 24.10.2018 / 15:24