Linux
管道PID到jstack
我編寫了一個命令行,可以有效地從 top -H 中提取最高 CPU java PID 執行緒程序(範常式式碼):
top -H -n 1 | grep "java" | head -n 1 | cut -d' ' -f1
我想檢查 jstack 中的 PID。由於執行緒出現和消失的速度有多快,因此無法手動輸入 PID,我希望將結果直接通過管道傳輸到 jstack 中,但是每當有人這樣做時,例如(重現問題的最簡單程式碼範例):
12345 | jstack
jstack 只是拋出使用幫助頁面,好像管道沒有將變數發送到 jstack。
如何將我通過命令獲得的 PID 獲取到 jstack 中?
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
(我提取前兩個是因為第一個總是匹配 PID,它將整個程序的所有 CPU 使用率分組)。
您可以使用
printf
以十六進制輸出:printf "%x\n" $(ps -L -C java -o tid --sort %cpu --no-headers | head -n 2)