前回は、シグナルについて、シェルでのキー操作を通じて確認しました。今回は、killコマンド/killallコマンドを使って、動作中のプロセスにシグナルを送ってみましょう。
何らかの理由で終了させることができなくなった「プロセス」は、「kill」コマンドや「killall」コマンドで終了させることができます。また、killallコマンドは、キー入力などを受け付けないサーバプロセスを終了させたり、再起動させたりする際にも使用します。
killコマンド/killallコマンドは、動作中のプロセスに対して「シグナル」を送信するコマンドです。プロセスの終了には「TERMシグナル(SIGTREM)」や「KILLシグナル(SIGKILL)」を、サーバプロセスの終了/再起動には「HUPシグナル(SIGHUP)」を送信します。
なお、killコマンドは実行時に「プロセスID」を指定するのに対し、killallコマンドは対象の「プロセス名」を指定します。この他、プロセス名を指定してシグナルを送信するコマンドには「pkill」があります。
なお、シグナルには以下のようなものがあります。本連載第16回でも紹介しているので、そちらも参照してください。
名前 | 番号 | 意味 |
---|---|---|
SIGINT | 2 | キーボードからの割り込みシグナル(通常は[CTRL]+[C]) |
SIGKILL | 9 | 強制終了シグナル(KILLシグナル) |
SIGPIPE | 13 | 読み手のいないパイプへの書き込み (通常はこのシグナルを受け取ると即時終了する) |
SIGCONT | 18 | 一時停止しているジョブへの再開シグナル |
SIGSTOP | 19 | 一時停止シグナル |
SIGTSTP | 20 | 端末からの一時停止シグナル(通常は[CTRL]+[Z]) |
それでは、端末アプリケーションを2つ使って、シグナルの送信を試してみましょう。片方の端末では、前回同様「ping localhost」を実行しています。コマンドの実行内容には特に意味はなく、“1秒間隔で何かを出力し続ける”“[CTRL]+[C]で終了する”というコマンドとして使用しています。
もう片方の端末では「ps -a -O stat」でプロセスの状態を表示しています。「-a」は他の端末の情報も表示するオプション、「-O stat」は表示に「STAT(状態)」を加えるオプションです。こちらの端末では、「ps」コマンドに続いて、killallコマンドで実行中のpingコマンドにシグナルを送っています。
killallコマンドで「SIGTERM(終了)」以外のシグナルを送るには、「-シグナル名」を指定します(画面1)。さらに、シグナル名の“SIG”は省略できるので、例えば「SIGSTOP」であれば「killall -STOP コマンド名」と指定することができます。
なお、画面1内の緑色で表示されている「S」は、割り込み可能なスリープ状態を示します。一瞬実行されて、その後は入力待ちのようなコマンドはこのように表示されます。また、フォアグラウンドで実行されている場合は「+」も表示されます。
pingコマンドを実行している端末は、以下の画面2のようになっています。
画面2のpingコマンドはバックグラウンドで停止していたため、最後の「Terminated」の部分は次のコマンドを実行すると表示されます(この実行画面では[Enter]キーを入力して表示)。
なお、pingコマンドの場合、SIGINT([CTRL]+[C])で終了すると、最後に「統計情報(statistics)」が出力されます。従って、「killall ping」(SIGTERMを送信)で終了した場合と、「killall -SIGINT ping」で終了した場合は表示が変わります(画面3)。
Copyright © ITmedia, Inc. All Rights Reserved.