Linuxシステムのプロセスを管理する基本コマンド

 最近のオペレーティングシステムならどれでも、一度に複数のプログラムを実行することができる。例えば典型的なLinuxサーバなら、ウェブサーバ、メールサーバ、それにおそらくデータベースサービスなどを起動していることだろう。そのようなプログラムはそれぞれ独立したプロセスとして実行されているが、そのようなサービスのうちのどれかが動作しなくなってしまったらどうすれば良いだろうか。以下では、プロセスの管理をするために手軽に使えるコマンドラインのツールを紹介する。

 プロセスはどれも、システムのCPU時間やメモリ空間やディスク空間などのシステムリソースを使用している。しかしプロセスに問題が起こると、CPU時間やメモリ空間の過剰な消費が始まってしまい、その結果、他のプロセスが実行に必要なリソースを得ることができなくなってしまうことがある。

 そのような暴走プロセスを管理するための方法を知っておくことは、Linuxのシステム管理では不可欠な知識だ。Linux上でプロセスを管理するためには、ps、top、service、kill、killallのようなコマンドラインツールを利用することができる。

ps

 psは、マシン上で現在実行中のプロセスを表示する。psには数多くのオプションがあるが、中でももっとも便利な起動方法の一つとして、「ps aux」がある。「ps aux」と実行すると、システム上のすべてのプロセスが表示される。

 ブート後の通常のLinuxサーバにはおそらく100個程度のプロセスがあるため、psコマンドの出力はかなり長いものになる。以下に、CentOS 5搭載のテスト用マシンで実行したpsの出力結果の最初の部分を示す。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  10308   668 ?        S    15:03   0:00 init [5]
root         2  0.0  0.0      0     0 ?        S    15:03   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   15:03   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    15:03   0:00 [watchdog/0]
root         5  0.0  0.0      0     0 ?        S

 各項目について以下に簡単に説明する。

  • USER:プロセスを所有しているユーザのユーザ名。
  • PID(プロセスID):各プロセスに与えられている一意のプロセス番号。
  • %CPU:各プロセスのCPUの使用率。CPUを使用した時間をプロセスの実行時間で割った結果のパーセンテージで表示される。
  • %MEM:プロセスが使用している物理メモリ量。
  • VSZ:プロセスの仮想メモリサイズ(単位はキロバイト)。
  • RSS:VSZと似ているが仮想メモリサイズではなく、プロセスが使用しているスワップされていない物理メモリ量(単位はキロバイト)。
  • TTY:制御端末。
  • STAT:プロセスの状態。なおSはプロセスがスリープ状態にあり、かつ、すぐにでも実行可能状態になる可能性があることを示し、Nはプロセスの優先度が低いことを示し、<はプロセスの優先度が高いことを示す。その他に注目すべき文字には、l(プロセスがマルチスレッド化されていることを示す)やR(プロセスが実行中であることを示す)などがある。
  • START:プロセスを起動した時刻。
  • TIME:累積したCPU時間。プロセスが使用した全CPU時間と、そのプロセスのためにカーネルが使用した全CPU時間の合計。

 より詳しい説明についてはpsのmanページを参照して欲しい。

 psの長い出力結果から特定のプロセスを探すのは困難なこともある。そのような場合には、grepコマンドを利用してマッチする文字列を見つけ出すと良い。例えばsendmailのプロセスを見つけるためには以下のようなコマンドを使用する。

ps aux | grep sendmail
root      2401  0.0  0.4  66444  2064 ?        Ss   15:04   0:00 sendmail: accepting connections
smmsp     2409  0.0  0.3  53040  1752 ?        Ss   15:04   0:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
gary      3807  0.0  0.1  60224   700 pts/2    R+   15:17   0:00 grep sendmail

 上記のように実行すると、目的の文字列(sendmail)にマッチするためにgrepコマンド自体(上記の例ではPID 3807のプロセス)も出力に含まれる。しかし当然ながらそれはsendmailサービスの一部ではない。