■現象
$ more /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)
*topコマンドの出力は見やすくするために”VIRT RES SHR %MEM TIME+”は削除しています。
(1)初期状態 testpro1実行中
topコマンドで確認
# $ top PID USER S %CPU COMMAND 9999 user1 S 134.2 /usr/bin/testpro1
(2)コールスタックを出力させるために pstack PID を実行
# $ pstack 9999 # gdb で PID 9999のtespro1が停止させられる。 PID USER S %CPU COMMAND 9999 user1 S 159.7 /usr/bin/testpro1 10000 user1 S 0.0 gdb --quiet -nx /proc/9999/exe 9999
pstack 9999 の実行で、gdb によってPID 9999のtespro1が停止させられる。
上記はpstack実行直後で、pstackの応答がない状態。
(3) Ctrl+C でpstackを止める
$ pstack 9999
^C^C
Ctrl+C でpstackを止めようとしても、応答なしで止まらない。
# $ pstack 9999 ^C^C PID USER S %CPU COMMAND 9999 user1 T 0.0 /usr/bin/testpro1 10000 user1 S 0.0 gdb --quiet -nx /proc/9999/exe 9999
testpro1はCPU使用率(%CPU)がゼロになり、停止状態になった。
S: プロセスの状態 (State)が”T” 停止状態。
“T” (Traced)は 停止 (トレース) 状態で、プロセスがデバッガー (gdb など) によって一時停止されている状態を表す。
Ctrl+C でpstackが止まらないが、PID 10000のgdbをkillすると pstackは止まる。
pstackがgdbを起動して操作しているような感じですが、関連性は未調査。
(4)kill -9 PIDで gdbのプロセスを停止させる
kill -9 PIDで gdbのプロセスを停止させます。
# $ kill -9 10000 PID USER S %CPU COMMAND 9999 user1 T 0.0 testpro1
gdb自体はKILLされましたが、testpro1は止まったままです。
(5)testpro1が停止状態(“T”)なので再開させる
“T”のままなので、kill -cont で継続(continue)させます。
# $ kill -cont 9999 PID USER S %CPU COMMAND 9999 user1 S 157.3 testpro1
状態が、”S”になり、CPU使用率も上がり、処理が進んでいます。
■kill -CONT <プロセスID>
killは、プロセスに対してシグナルを送るために使用されます。
-contはそのオプションの一つで、停止中のプロセスを再開させるために使います。
CONT は continue (継続) の略です。
そもそものpstackでコールスタックが採取できずに固まる原因は分かっていませんが、何か起きた場合に対応方法として使える知識だと思い、紹介しました。
本番環境でpstackを実行すると一時停止の可能性があること頭に入れておいたほうがいいですね。(安易に実施しない)