前回、ジョブを停止させる際に使用した[CTRL]+[Z]キーや、コマンドの実行を中断したいときの[CTRL]+[C]キーは、どんな意味を持つ操作なのでしょうか。今回は、Linuxの「プロセス」や「ジョブ」の制御に関わりの深い「シグナル」を解説します。
「シグナル」はプロセスとプロセスの間で通信を行う際に使用される“信号”のことで、シグナルを受け取ったプロセスは“何らかの動作”を行います。その動作は、例えば「再起動」であったり、「終了」であったりします。
[CTRL]+[C]は「SIGINT」というシグナルを行うキー操作、[CTRL]+[Z]は「SIGTSTP」というシグナルを行うキー操作です。
シグナルには多くの種類があり、名前と数値による値が決まっています。例えば、「1」は「SIGHUP(ハングアップ、制御している端末の終了)」、「2」は「SIGINT(インタラプト、キーボードからの割り込み)」です。主なシグナルは以下の通りです。
名前 | 番号 | 動作(※) | 意味 |
---|---|---|---|
SIGHUP | 1 | Term | 制御端末の切断(ハングアップ)、仮想端末の終了 |
SIGINT | 2 | Term | キーボードからの割り込みシグナル(通常は[CTRL]+[C]) |
SIGQUIT | 3 | Core | キーボードによる中止シグナル(通常は[CTRL]+[\]) |
SIGFPE | 8 | Core | 不正な浮動小数点演算(ゼロ除算やオーバーフローなど)の発生 |
SIGKILL | 9 | Term | 強制終了シグナル(KILLシグナル) |
SIGSEGV | 11 | Core | 不正なメモリ参照の発生 |
SIGPIPE | 13 | Term | 読み手のいないパイプへの書き込み (通常はこのシグナルを受け取ると即時終了する) |
SIGALRM | 14 | Term | タイマー(Alarm)による終了 |
SIGTERM | 15 | Term | 終了シグナル(「kill」コマンドのデフォルトシグナル) |
SIGCHLD | 17 | Ignore | 子プロセスの状態(終了、停止または再開)が変わった |
SIGCONT | 18 | Cont | 一時停止しているジョブへの再開シグナル |
SIGSTOP | 19 | Stop | 一時停止シグナル |
SIGTSTP | 20 | Stop | 端末からの一時停止シグナル(通常は[CTRL]+[Z]) |
SIGTTIN | 21 | Stop | バックグラウンドジョブ/プロセスのキーボード入力待ち |
SIGTTOU | 22 | Stop | バックグラウンドジョブ/プロセスの端末出力待ち |
SIGXCPU | 24 | Core | CPU時間制限を越えた |
SIGXFSZ | 25 | Core | ファイルサイズ制限を越えた |
SIGWINCH | 28 | Ignore | ウィンドウのサイズが変更された |
(※)「動作」はシグナルを受け取った際の動作で、デフォルトは以下の通りです。実際にどのような動作になるかは、コマンドによって異なります。
Term | プロセスの終了 |
---|---|
Ignore | 無視 |
Core | プロセスの終了とコアダンプ出力 |
Stop | プロセスの一時停止 |
Cont | プロセスが停止中の場合は実行の再開 |
この他、どのようなシグナルがあるかは「man 7 signal」コマンドで確認できます(※)。また、「man bash」コマンドで「sig」や「シグナル」を検索すると、bashでの動作を調べることができます。
【※】「man」はマニュアルを参照するためのコマンドです。「man 7 signal」の「7」は章番号で、7章は「その他(Miscellaneous)」に分類されています(連載「Linux基本コマンドTips 第87回」参照)。
プロセスがシグナルを受け取ると何が起こるかは、コマンドによって異なります。
例えば、端末で使用するコマンドの多くは、SIGINTを受け取ると実行を終了するようになっているため、[CTRL]+[C]キーで「実行中のプログラムを終了」させることができます。一方で、「less」コマンドのように終了しないようになっているコマンドもあります。
端末で実行しているコマンドは、SIGHUPを受け取ると終了します。従って、X(X Window System)環境でコマンドを実行している最中に端末アプリケーションを終了すると、そのコマンドは終了します。また、ssh接続でコマンドを実行している最中に回線が切断された場合も、そのコマンドは終了します。
これを防ぐのが「nohup」コマンドです。「nohup コマンド &」のように、コマンドnohupでコマンドをバックグラウンド実行させると、端末を終了させてもコマンドがSIGHUPを受け取らないようになり、その結果、コマンドは終了しなくなります。
サーバプロセスの多くはSIGHUPを受け取るとプロセスを終了して再起動します。このため、SIGHUPシグナルは「設定ファイルの再読込」をさせたいときにも使われます。
シグナルは、通常“端末が切断されたとき”や“異常終了したとき”などの出来事に応じて発生します。
意図的にシグナルを発生させるには、キー操作や「kill」コマンドを使用します。killコマンドの場合は「kill -s シグナル プロセスID」または「kill -s シグナル %ジョブ番号」でシグナルを送ります。送ることができるシグナルは「kill -l」で確認できます。
この他、シグナルを送ることができるコマンドには、シグナルを送る対象を名前で指定する「killall」コマンドや「pkill」コマンドなどがあります(※)。
【※】pkill以前のコマンドに「skill」コマンドがあります。skillコマンドは、psコマンドやpkillコマンドと同じ「procps-ng」パッケージに収録されています。
「シグナルを送るキー操作」でよく使われるのが、本稿の最初に挙げた[CTRL]+[C]キーと[CTRL]+[Z]キーです。
[CTRL]+[C]キーは、フォアグラウンドで実行されているプロセス(フォアグラウンドジョブで実行されている全てのプロセス)に「SIGINT」シグナルを送ります。多くのプロセスはSIGINTシグナルを受け取ると終了します。そこで、“実行中のコマンドを終了させるには[CTRL]+[C]キー”という使い方ができます。
同様に、[CTRL]+[Z]キーは、フォアグラウンドで実行されているプロセスに「SIGTSTP」シグナルを送ります。SIGTSTPシグナルを受け取ったプロセスは「停止」します。停止したプロセスは「fg」コマンドまたは「bg」コマンドで「再開」します。
端末のキー操作は「stty -a」で確認できます(画面1)。「stty」は端末の設定を変更/表示するコマンドです。
なお、シグナルとは働きが異なりますが、同じように使用できるキー操作として、表示の一時停止と再開を行う[CTRL]+[S]キーと[CTRL]+[Q]キー、入力の終了(EOF:End Of File)を表す[CTRL]+[D]キーなどがあります。[CTRL]+[D]キーはbashのデフォルト設定の場合に「入力の終了」、すなわち「直ちにシェルを終了」という動作になるので注意してください(※)。
【※】環境変数IGNOREEOFで「シェルが[CTRL]+[D]を無視する回数」を設定できます。例えば、「IGNOREEOF=3」で3回無視(=4回目でシェルを終了)となります。また、「set -o ignoreeof」で10回無視(「IGNOREEOF=10」相当)という設定ができます。
それでは、実際にシグナルを送るキー操作を試してみましょう。
以下の画面2と画面3では、動作を分かりやすくするために「ping localhost」を実行してキー操作を試しています。「ping」コマンドは、サーバやIPアドレスを指定して応答の有無を調べるコマンドです。今回は対象を「localhost」、つまり自分自身として、単に“1秒ごとに結果を1行表示し続けるコマンド”として使用しています。
[CTRL]+[Q]キーは表示を再開するだけで、シグナルは送信されません。なお、[CTRL]+[Q]以外のキーでも再開できますが、その場合は入力したキーが表示されます。
このとき、別の端末で「ps」コマンドを使ってプロセスの状態を表示すると、以下のようになります(画面4)。
ここでは、「ps -a -O stat」としています。「-a」は他の端末の情報も表示するオプション、「-O stat」は表示にSTAT(状態)を加えるオプションです。
画面4内に緑色で表示されている「S」は、割り込み可能なスリープ状態を示します。一瞬実行されて、その後は入力待ちのようなコマンドはこのように表示されます。また、フォアグラウンドで実行されている場合は「+」も表示されます。
次回はkillコマンドを使ったシグナルの送信を試します。
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.