現在のプロセスの確認(ps)
Linuxのプロセス管理について説明していきます。
そもそもプロセスとは何なのか。現在のプロセスの確認手順や、プロセスのPID、UID、GID等の属性情報の確認手順等を紹介します。
Last Update : 2014年02月07日
プロセス管理~現在のプロセスの確認(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 が使われている) |
+ | フォアグラウンドのプロセスグループに含まれている |