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使用率を1つにグループ化するPIDと常に一致するため、最初の2つを抽出しました。)
以下を使用して16進数で出力できますprintf
。
printf "%x\n" $(ps -L -C java -o tid --sort %cpu --no-headers | head -n 2)