top -H(샘플 코드)에서 가장 높은 CPU Java PID 스레드 프로세스를 효율적으로 추출하는 명령줄을 작성했습니다.
top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1
jstack에서 PID를 확인하고 싶습니다. 스레드가 너무 빨리 나타나고 사라지기 때문에 PID를 수동으로 입력하는 것은 불가능합니다. 결과를 jstack으로 직접 파이프하고 싶지만 누군가가 이를 수행할 때마다 예를 들어(문제를 재현하기 위한 가장 간단한 코드 예) 다음과 같습니다.
12345 | jstack
jstack은 마치 Pipe가 jstack에 변수를 보내지 않은 것처럼 사용법 도움말 페이지를 표시합니다.
명령을 통해 얻은 PID를 jstack으로 가져오는 방법은 무엇입니까?
답변1
jstack
프로세스 ID가 매개변수로 제공될 것으로 예상하므로 명령 대체를 사용해야 합니다.
jstack "$(top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1)"
출력을 필터링하는 ps
대신 찾기 프로세스를 사용할 수 있습니다 .top
jstack "$(ps -C java -o pid --sort %cpu --no-headers | head -n 1)"
이는 ps
명령과 일치하는 프로세스를 찾고 java
PID만 출력하며 CPU 사용량에 따라 정렬되고 헤더는 없으며 첫 번째 결과가 제공됩니다 jstack
.
찾다CPU를 가장 많이 사용하는 스레드 ID, 출력으로 변경 tid
하고 선택적으로 스레드를 -L
처리합니다 ps
.
ps -L -C java -o tid --sort %cpu --no-headers | head -n 2
(첫 번째 것은 프로세스의 모든 CPU 사용량을 하나로 그룹화하는 PID와 항상 일치하기 때문에 처음 두 개를 추출했습니다.)
다음을 사용하여 16진수로 출력 할 수 있습니다 printf
.
printf "%x\n" $(ps -L -C java -o tid --sort %cpu --no-headers | head -n 2)