PIDをjstackにパイプ

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 は、 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コマンドに一致するプロセスを見つけてjavaPIDのみを出力し、CPU使用率に基づいてソートされ、ヘッダーはなく、最初の結果が得られますjstack

探すCPUを最も使用するスレッドID、出力に変更し、オプションtidでスレッドを-L処理しますps

ps -L -C java -o tid --sort %cpu --no-headers | head -n 2

(最初は、プロセスのすべてのCPU使用率を1つにグループ化するPIDと常に一致するため、最初の2つを抽出しました。)

以下を使用して16進数で出力できますprintf

printf "%x\n" $(ps -L -C java -o tid --sort %cpu --no-headers | head -n 2)

おすすめ記事