プロセスの停止状態 (stopped)

estis2013/06/22 (土) 11:47 に投稿

ps の manページに次のようにある。

---------------------------------------------------------------
プロセスの状態コード
s, stat, state 出力指定子 (ヘッダ "STAT" または "S") がプロセス状態の説明のために表示する値を以下に示す。
D 割り込み不可能なスリープ状態 (通常 IO 中)
R 実行中または実行可能状態 (実行キューにある)
S 割り込み可能なスリープ状態 (イベントの完了を待っている)
T ジョブ制御シグナルまたはトレースされているために停止中の状態
W ページング状態 (2.6.xx カーネルからは無効)
X 死んだ状態 (見えるべきではない)
Z 終了したが、親プロセスによって回収されなかった、消滅した (ゾンビ) プロセス

BSD 形式で stat キーワードが用いられたときは、以下の添付文字が表示されることがある。
< 優先度の高いプロセス (他のユーザーに対して良くない)
N 優先度の低いプロセス (他のユーザーに対して良い)
L 実メモリのページをロックして利用している (リアルタイム処理やカスタム IO 向け)
s セッションリーダ
l マルチスレッド化されている (NPTL pthreads が行うように、CLONE_THREAD が使われている)
+ フォアグラウンドのプロセスグループに含まれている
---------------------------------------------------------------

stopped のプロセスは、
「ジョブ制御シグナルまたはトレースされているために停止中の状態」
はこの状態。

ps auxw|grep [h]ttpd
root 8217 0.0 0.6 11196 3112 ? Ss May26 0:06 /usr/sbin/httpd
apache 17002 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17004 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17005 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17006 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17007 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17008 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17009 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd

の時、
# kill -STOP 8217
すると、

# ps auxw|grep [h]ttpd
root 8217 0.0 0.6 11196 3112 ? Ts May26 0:06 /usr/sbin/httpd
apache 17002 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17004 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17005 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17006 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17007 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17008 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17009 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd

こうなる。

ここで、
# kill 17002
すると、

# ps auxw|grep [h]ttpd
root 8217 0.0 0.6 11196 3112 ? Ts May26 0:06 /usr/sbin/httpd
apache 17002 0.0 0.0 0 0 ? Z 22:00 0:00 [httpd]
apache 17004 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17005 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17006 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17007 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17008 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17009 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd

こうなる。
親プロセス(この場合PID8217)が停止しているので、終了したプロセス(この場合PID17002)がゾンビになっている。

# kill -CONT 8217
で、停止解除すると、

# ps auxw|grep [h]ttpd
root 8217 0.0 0.6 11196 3112 ? Ss May26 0:06 /usr/sbin/httpd
apache 17004 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17005 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17006 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17007 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17008 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17009 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd

さらに
# kill 17004
すると、
ps auxw|grep [h]ttpd
root 8217 0.0 0.6 11196 3112 ? Ss May26 0:06 /usr/sbin/httpd
apache 17005 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17006 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17007 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17008 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd
apache 17009 0.0 0.4 11196 2112 ? S 22:00 0:00 /usr/sbin/httpd

親プロセス(この場合PID8217)が回収したので、終了したプロセス(この場合はPID17004)はゾンビにならない。