Linux

Linux pstackで対象プロセスが停止状態になったときの再開方法

*記事内に商品プロモーションを含む場合があります

■現象

$ 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を実行すると一時停止の可能性があること頭に入れておいたほうがいいですね。(安易に実施しない)