シグナルは、通常“端末が切断されたとき”や“異常終了したとき”などの出来事に応じて発生します。
意図的にシグナルを発生させるには、キー操作や「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.