Linux

管道PID到jstack

  • October 24, 2018

我編寫了一個命令行,可以有效地從 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 的執行緒 IDtid ,請改為輸出,並帶有-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)

引用自:https://unix.stackexchange.com/questions/477518