trap - シグナルを受信したときの動作を設定する

スポンサーリンク

trapコマンドはプロセスがシグナルを受信したときの動作を設定できるコマンドになります。
シグナルは、Ctrl+cによる割込みを行ったとき(SIGINT)や停止しているプロセスが再開したとき(SIGCONT)の様々な条件によってプロセスにシグナルが送られます。

プロセスが特定のシグナルを受信したときに動作する処理はシグナルごとに決められています。trapコマンドはその動作をなしにしたり、別の処理としてコマンドや関数を指定してシグナルが送られたときにその処理を行うことができます。

trapコマンドの構文

trapコマンドの構文

arg:コマンドや関数

sigspec:シグナル名またはシグナル番号

 

 

 

trapコマンドの利用例

シグナルの動作を変更

trapコマンドはコマンドまたは関数とシグナルを指定することでシグナルが発生したときの動作を変更できます。ただし、SIGKILLのシグナルについては指定しても意味がありません。

コマンド例ではCtrl+cによる割込みでのプログラムの終了の動作をechoコマンドの動作に変更しています。

test.sh

コマンド例と実行結果

 

シグナルの指定について、始めの'SIG'という文字を省略できます。例えば、

で指定できます。また、trapコマンドの-lオプション等で確認できるシグナル番号でも指定できます。例えば、SIGINTの場合は2になります。

Ctrl+cを利用しないプログラムの処理の終了については、Ctrl+zによるプロセスの停止でした後にkillコマンドを用いて処理を終了できます。

 

kill - プロセスにシグナルを送信する
killコマンドはプロセスにデフォルトとしてTERMシグナルを送信し、そのプロセスを終了できます。 また、killコマンドはプロセスを強制終了させたいときにも、よく利用されます。 その場合は、killコマンドはKILLシグナルを送信して、プ...

 

また、第一引数に空の文字列を入れることでそのシグナルの動作は何も処理を行いません。

test2.sh

コマンド例と実行結果

 

 

 

trapコマンドの設定を確認
(-pオプション)

-pオプションを用いるとそれぞれのシグナルについて、trapコマンドの現在の設定を確認することができます。また、引数にシグナルを指定することでそのシグナルについての設定を確認することができます。

コマンド例と実行結果

 

引数なしでtrapコマンドを使用した場合でもtrapコマンドの現在の設定を確認できます。
コマンド例と実行結果

 

 

 

シグナルの動作をデフォルトの動作に変更

変更されているシグナルの動作をデフォルトの動作に戻す方法はいくつかあります。

一つは第一引数に'-'を指定する方法になります。例えば、

のように指定します。

コマンド例と実行結果

 

他にもtrapコマンドでシグナルを一つのみを指定するとそのシグナルはデフォルトの動作になります。例えば、

のように指定します。

コマンド例と実行結果

 

また、シグナル番号のみを列挙してもデフォルトの動作にすることができます。例えば、

のように指定します。また、2はSIGINTを、15はSIGTERMのシグナル番号になります。

コマンド例と実行結果

 

 

 

シグナルの一覧を表示
(-lオプション)

-lオプションを用いることで、シグナル名とシグナル番号を確認することができます。

コマンド例と実行結果

 

 

 

シグナルについて

それぞれのシグナルの処理としてデフォルトのアクションがそれぞれあります。

デフォルトのアクション

アクション 意味
Term プロセスの終了
Ign シグナルを無視
Core プロセスの終了とコアダンプファイルの作成
Stop プロセスの停止
Cont 停止中のプロセスを再開

 

それぞれのシグナルがどのようなときに送信されるかやデフォルトの動作はどのような処理が行われるかはそれぞれ決められています。
例えば、POSIX.1-1990 に定義されているシグナルについては以下の表のようになります。

POSIX.1-1990のシグナル表

シグナル 番号 アクション 意味(シグナル送信のタイミング等)
SIGHUP  1 Term 制御端末のハングアップ(操作不能状態)の検出や
制御しているプロセスの死
SIGINT  2 Term キーボードからの割り込み (Interrupt)
SIGQUIT  3 Core キーボードによる中止 (Quit)
SIGILL  4 Core 不正な命令
SIGABRT  6 Core abort(3) からの中断 (Abort) シグナル
SIGFPE  8 Core 浮動小数点例外
SIGKILL  9 Term Kill シグナル
SIGSEGV 11 Core 不正なメモリー参照
SIGPIPE 13 Term パイプ破壊:
読み手の無いパイプへの書き出し
SIGALRM 14 Term alarm(2) からのタイマーシグナル
SIGTERM 15 Term 終了 (termination) シグナル
SIGUSR1 30,10,16 Term ユーザー定義シグナル 1
SIGUSR2 31,12,17 Term ユーザー定義シグナル 2
SIGCHLD 20,17,18 Ign 子プロセスの一時停止 (stop) または終了
SIGCONT 19,18,25 Cont 一時停止 (stop) からの再開
SIGSTOP 17,19,23 Stop プロセスの一時停止 (stop)
SIGTSTP 18,20,24 Stop 端末より入力された一時停止 (stop)
SIGTTIN 21,21,26 Stop バックグランドプロセスの端末入力
SIGTTOU 22,22,27 Stop バックグランドプロセスの端末出力

(参考:Man page of SIGNAL

 

他にも参考として、シグナルについて、manコマンドで確認する場合は、

で確認することができます。

 

 

 

参考

Bash Reference Manual