Linuxの「シグナル」って何だろう?:“応用力”をつけるためのLinux再入門(16)(1/2 ページ)
前回、ジョブを停止させる際に使用した[CTRL]+[Z]キーや、コマンドの実行を中断したいときの[CTRL]+[C]キーは、どんな意味を持つ操作なのでしょうか。今回は、Linuxの「プロセス」や「ジョブ」の制御に関わりの深い「シグナル」を解説します。
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シグナルは「設定ファイルの再読込」をさせたいときにも使われます。
Copyright © ITmedia, Inc. All Rights Reserved.