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

スポンサーリンク

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

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

trapコマンドの構文

trapコマンドの構文

arg:コマンドや関数

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

シグナルの動作を変更

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

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

test.sh

コマンド例と実行結果

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

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

Ctrl+cを利用しないプログラムの処理の終了については、Ctrl+zによるプロセスの停止でした後に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 1Term制御端末のハングアップ(操作不能状態)の検出や
制御しているプロセスの死
SIGINT 2Termキーボードからの割り込み (Interrupt)
SIGQUIT 3Coreキーボードによる中止 (Quit)
SIGILL 4Core不正な命令
SIGABRT 6Coreabort(3) からの中断 (Abort) シグナル
SIGFPE 8Core浮動小数点例外
SIGKILL 9TermKill シグナル
SIGSEGV11Core不正なメモリー参照
SIGPIPE13Termパイプ破壊:
読み手の無いパイプへの書き出し
SIGALRM14Termalarm(2) からのタイマーシグナル
SIGTERM15Term終了 (termination) シグナル
SIGUSR130,10,16Termユーザー定義シグナル 1
SIGUSR231,12,17Termユーザー定義シグナル 2
SIGCHLD20,17,18Ign子プロセスの一時停止 (stop) または終了
SIGCONT19,18,25Cont一時停止 (stop) からの再開
SIGSTOP17,19,23Stopプロセスの一時停止 (stop)
SIGTSTP18,20,24Stop端末より入力された一時停止 (stop)
SIGTTIN21,21,26Stopバックグランドプロセスの端末入力
SIGTTOU22,22,27Stopバックグランドプロセスの端末出力

(参考:Man page of SIGNAL

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

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

参考

Bash Reference Manual