5.7. プロセスとシグナル制御 -ps , killコマンド-
5.7. プロセスとシグナル制御 -ps , killコマンド-
Linuxでは、プログラムのことをプロセス(process)と呼びます。プログラムは主にディスクに格納されており、メモリにコピーされた時にはプロセスと呼ばれます。LinuxはマルチタスクOSですから、同時に複数のプロセスがシステムで動くことになります。そのためプロセスの管理は一般ユーザにとっても、管理者にとっても重要です。
プロセスには1〜32767までの番号(プロセスID→PID)が一意に割り振られます。
互いの区別はPIDにより行われています。また、プロセスは起動したユーザが所有権を持ち(特殊な状態で変更することが可能です)、そのユーザレベルでしか行動することはできません。
【コマンド説明】
- ps:process
プロセスを確認するにはpsコマンドを用います。引数を付けないで実行すると、 プロセス識別子、端末名、 CPU時間、コマンド名を表示します。psには多くのオプションがありますが、通常使うのはa,u,x,wというオプションです。慣例として、psのオプションには、オプションであることを示す“-”をつけません。(これはBSD書式です。UNIX書式の場合は必ず"-"を必要とします)
- kill
プロセスを終了させるためのコマンドです。「SIGTERM」や「SIGKILL」というシグナルを送信します。killコマンドで指定可能なシグナルの一覧は、killコマンドに"-l"オプションを付けて実行すると確認できます。
両コマンドともに、manコマンドで日本語の解説を参照できますので、詳しい説明はそちらを確認してみて下さい。
【動画説明】
早速psコマンドにオプションを付けて実行し、動作中のプロセスを確認してみましょう。
$ ps auwx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19328 1332 ? Ss Jan23 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S Jan23 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jan23 0:00 [migration/0]
root 4 0.5 0.0 0 0 ? S Jan23 59:01 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Jan23 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S Jan23 0:01 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Jan23 0:00 [migration/1]
root 8 0.0 0.0 0 0 ? S Jan23 0:00 [migration/1]
root 9 0.1 0.0 0 0 ? S Jan23 17:44 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S Jan23 0:00 [watchdog/1]
出力結果は以下のように読むことができます。
● USER 動作権限
● PID プロセスID
● %CPU 単位時間内でのCPU利用率
● %MEM 単位時間内でのメモリ利用率
● VSZ プロセスが要求しているメモリ量
● RSS VSZ中、実際に利用しているメモリ量
● TTY 利用している端末名(端末を使っていない場合には“?”になる)
● STAT プロセス状態、主にS(Sleep=休眠)かR(Run=動作中)である
● START TIME 活動開始時間とCPU使用時間の合計
● COMMAND 起動しているプロセス名
なんらかの理由でプロセスを終了させたい場合には、PIDをpsコマンドで確認した上で、killコマンドを使って停止させることができます。(ただしkillコマンド実行ユーザ所有のプロセスのみです)
たとえば、ps実行後にPID XXXX(実際のID番号)を終了させたいという場合は、killコマンドに引数としてXXXXを渡すことで、指定したPIDを持つプロセスを終了させることができます。
$ kill XXXX
しかし、他人が所有するプロセスを止めようとすると、(root以外は)拒否されます。
さて、killコマンドによるプロセスの終了というものを紹介しましたが、この仕組みについて少し詳しく知っておきましょう。UNIX/Linuxにはシグナル(信号)というものが用意されていて、このシグナルを特定のプロセスに送ることができます。シグナルは一般的なものから内部用のものまで、合わせると数十存在します。この情報はオンラインマニュアルで調べると細かい情報があります。またシグナル名の一覧はkillコマンドに"-l"オプションを付けて実行すると表示されます。
$ man 7 signal
$ kill -l
先ほど用いたkillコマンドは、このシグナルを送りつけるためのものであり、特にオプション指定しない場合は、送信されるシグナルは“SIGTERM”(15番)となります。このシグナルは「終了して下さい」という意味で、受信したプロセスは終了に向けた処理を行うようになります。しかし、シグナルを受けた時の反応は、一部の例外を除いてプログラミング可能なため、わざとシグナルの意図に従わないという構造のプログラムも存在しています。また、そもそも受けたシグナルに応答しないものもあります。それ以外にも、暴走していてシグナルに応答できないというケースもあります。こういったプロセスはいくらkillしても終了しません。
このような暴走プロセスに対して効果があるのが“SIGKILL”(9番)であり、強制終了させることができます。SIGKILLを送るためには、下記のようにコマンドを実行します。(XXXXはプロセスID)
$ kill -9 XXXX
(または)
$ kill -s SIGKILL XXXX
“-番号”でシグナル番号を指定することもできます。(ここでは"-9"と指定)
応用例として、killallコマンドがあります。こちらはプロセスIDではなくプロセス名を引数とすることにより、該当したプロセス全てにシグナルを送ることが可能という便利なものですが、意図していないプロセスにまでシグナルを送ることがあるため(他人のプロセスや同名で異なるプロセス等)、rootでの使用はおすすめしません。
プロセスを確認するために有効なツールとしては、psコマンドの他にtopコマンドがあります。topコマンドを使うと、端末全体を用いて、現在のプロセス状態を眺めることができます。
topコマンドは一定時間(標準設定で5秒)ごとに、最新の統計を表示するようになっており、継続的に監視をする時には非常に便利です。また、表示する際のプロセスの並べ方をCPUの利用率順や稼働時間順、メモリ使用順に変更、特定のプロセスにシグナルを送信する等の機能が用意されています。表示中に“?”を入力することでキー操作を確認できますのでチェックしてみて下さい。また、終了は“q”となっています。
【問題】
1. psコマンドで動作権限がrootのプロセスを抽出して表示してみましょう
2. psコマンドで所有ユーザがapacheのプロセスがあるか確認して、もしあれば該当する全てのプロセスを終了させてみましょう
ヒント:killallコマンドを使います