Linuxの「シグナル」って何だろう?“応用力”をつけるためのLinux再入門(16)

前回、ジョブを停止させる際に使用した[CTRL]+[Z]キーや、コマンドの実行を中断したいときの[CTRL]+[C]キーは、どんな意味を持つ操作なのでしょうか。今回は、Linuxの「プロセス」や「ジョブ」の制御に関わりの深い「シグナル」を解説します。

» 2017年08月04日 05時00分 公開
[西村めぐみ@IT]
「“応用力”をつけるための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シグナルは「設定ファイルの再読込」をさせたいときにも使われます。

シグナルを送るにはどうしたらよいか?

 シグナルは、通常“端末が切断されたとき”や“異常終了したとき”などの出来事に応じて発生します。

 意図的にシグナルを発生させるには、キー操作や「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」は端末の設定を変更/表示するコマンドです。

画面1 画面1 「stty -a」で端末の設定を確認する

 なお、シグナルとは働きが異なりますが、同じように使用できるキー操作として、表示の一時停止と再開を行う[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行表示し続けるコマンド”として使用しています。

画面2 画面2 [CTRL]+[S]キーで表示を停止([CTRL]+[S]キーはbashが表示を停止するだけで、シグナルは送信されません)
画面3 画面3[CTRL]+[Q]キーで表示を再開(画面2の続き)

 [CTRL]+[Q]キーは表示を再開するだけで、シグナルは送信されません。なお、[CTRL]+[Q]以外のキーでも再開できますが、その場合は入力したキーが表示されます。

 このとき、別の端末で「ps」コマンドを使ってプロセスの状態を表示すると、以下のようになります(画面4)。

画面4 画面4 画面2、画面3のときのプロセスをpsコマンドで表示

 ここでは、「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.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。