kazmax - Linux で自宅サーバー

現在のプロセスの確認(ps)

Linuxのプロセス管理について説明していきます。

そもそもプロセスとは何なのか。現在のプロセスの確認手順や、プロセスのPID、UID、GID等の属性情報の確認手順等を紹介します。

Last Update : 2014年02月07日

プロセス管理~現在のプロセスの確認(ps) 項目

  1. プロセスとは
  2. ps コマンドで現在のプロセスを確認する
  3. ps コマンドからわかる事

1. プロセスとは

プロセスとは、動作中のプログラムの事をいいます。

なんらかのプログラムが実行されればプロセスが生成されるので、単純な一つのコマンドを実行した際にもプロセスが生成されますし、WEBサービスや、メールサービス、データベース等のサーバープログラムなどが実行されてもプロセスは生成されます。

プログラムが終了するとプロセスも終了します。

全てのプロセスに、PID(プロセスID)という識別子がつけられそれぞれ独立したひとつの処理としてOSに認識されています。 現在どんなプロセスが動作しているのかは、「ps」というコマンドで確認する事ができます。

また、プロセスはUIDとGIDを持っており、そのUID,GIDの権限の範囲内で動作します。 プロセスが持つUID,GIDは、そのプログラムを実行したユーザーのUID,GIDから引き継がれます。 OSで動作しているプロセスがどんなUID,GIDで動作しているのかも、「ps」というコマンドで確認する事ができます。

2. ps コマンドで現在のプロセスを確認する

ps コマンドを実行して、現在どんなプロセスがあるのか確認してみます。

ps コマンド 書式

ps [options]

ps コマンド オプション

オプションは非常に多く、また、オプションの書き方自体にも何パターンか存在します。(ps コマンド マニュアル) ここでは、有用なオプションの組み合わせを紹介します。

システム上の全てのプロセスを表示させる

# ps -ef  ← -ef オプション
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2013 ?        00:00:01 /sbin/init
root         2     0  0  2013 ?        00:00:00 [kthreadd]
root         3     2  0  2013 ?        00:00:00 [migration/0]
root         4     2  0  2013 ?        00:00:02 [ksoftirqd/0]
root         5     2  0  2013 ?        00:00:00 [migration/0]
root         6     2  0  2013 ?        00:00:04 [watchdog/0]
root         7     2  0  2013 ?        00:02:44 [events/0]
root         8     2  0  2013 ?        00:00:00 [cgroup]
root         9     2  0  2013 ?        00:00:00 [khelper]
# ps axu  ← axu オプション。「-」の有無で意味が変わります
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  19356  1540 ?        Ss    2013   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S     2013   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S     2013   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S     2013   0:02 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S     2013   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S     2013   0:04 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S     2013   2:44 [events/0]
root         8  0.0  0.0      0     0 ?        S     2013   0:00 [cgroup]
root         9  0.0  0.0      0     0 ?        S     2013   0:00 [khelper]

プロセスツリーを表示する

プロセスには親子関係というものが存在します。あるプロセスが、処理の実行中に別のプロセスを生成する場合、生成されたプロセスの事を「子プロセス」、生成したプロセスを「親プロセス」と呼びます。

プロセスの親子関係を表示させるには、「f」オプションを使います。

# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
postgres  3588  0.0  0.6  22172  3264 ?     S     2013   0:04 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
postgres  3659  0.0  0.1  11952   816 ?     S     2013   0:03  \_ postgres: logger process
postgres  3661  0.0  1.3  22276  7128 ?     S     2013   0:00  \_ postgres: writer process
postgres  3662  0.0  0.3  12952  1732 ?     S     2013   0:11  \_ postgres: stats buffer process
postgres  3663  0.0  0.2  12292  1096 ?     S     2013   0:06      \_ postgres: stats collector process
# ps -ef f
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
postgres  3588     1  0  2013 ?        S      0:04 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
postgres  3659  3588  0  2013 ?        S      0:03  \_ postgres: logger process
postgres  3661  3588  0  2013 ?        S      0:00  \_ postgres: writer process
postgres  3662  3588  0  2013 ?        S      0:11  \_ postgres: stats buffer process
postgres  3663  3662  0  2013 ?        S      0:06      \_ postgres: stats collector process

memo

出力の幅が足りなくて表示が途中できれる場合は、「ww」オプションをつけると表示しきれなかった部分まで表示されます。

# ps auxww  とか、
# ps -ef ww  こんな感じ
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
root     25502     1  0 Jan08 ?        S      0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --
socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql    25604 25502  0 Jan08 ?        Sl     8:41 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/my
sql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

3. ps コマンドからわかる事

ps コマンドの結果から各プロセスの情報を読み取るには、ヘッダ項目の意味を知る必要があります。

# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD  ← ヘッダ
root         1     0  0  2013 ?        00:00:01 /sbin/init
root         2     0  0  2013 ?        00:00:00 [kthreadd]
root         3     2  0  2013 ?        00:00:00 [migration/0]
# ps axu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND  ← ヘッダ
root         1  0.0  0.1  19356  1540 ?        Ss    2013   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S     2013   0:00 [kthreadd]

ps コマンドのヘッダの意味を以下へ記します。

UID,USER実効ユーザーID、実効ユーザー名
PIDプロセスID番号
PPID親プロセスのプロセスID番号
C,%CPUプロセッサ使用率
%MEMメモリ使用率
CMD,COMMANDコマンド
TIMEユーザーとシステムの cpu 時間の合計
STATプロセスの状態コード(※下表参考)
STIME,STARTコマンドが起動した時刻。プロセスが24時間以内に起動されていた場合、出力フォーマットは "HH:MM" で、24時間以前の場合は "mmmdd"。
TTY制御端末(tty)
VSZプロセスの仮想メモリサイズ (KiB, 1024 バイト単位)
RSSタスクが使用しているスワップされていない物理メモリ (kB 単位)

STATのプロセスの状態コードについて

ヘッダの「STAT」または「S」は、プロセスの状態をコードで示しています。

コードの値とその意味

プロセスの状態コード内容
D割り込み不可能なスリープ状態(通常 IO 中)
R実行中または実行可能状態(実行キューにある)
S割り込み可能なスリープ状態(イベントの完了を待っている)
Tジョブ制御シグナルまたはトレースされているために停止中の状態
Wページング状態(2.6.xx カーネルからは無効)
X死んだ状態(見えるべきではない)
Z終了したが、親プロセスによって回収されなかった、消滅した(ゾンビ)プロセス

また、以下のような添付文字が表示されることもあります。

<優先度の高いプロセス(他のユーザーに対して良くない)
N優先度の低いプロセス(他のユーザーに対して良い)
L実メモリのページをロックして利用している(リアルタイム処理やカスタム IO 向け)
sセッションリーダ
lマルチスレッド化されている(NPTL pthreads が行うように、CLONE_THREAD が使われている)
+フォアグラウンドのプロセスグループに含まれている
プロセス管理 関連記事
Linux 基礎知識 関連記事