bash を使おう!④ : UNIX シグナル
今回は UNIX シグナルについて説明します。
UNIX シグナルとは
UNIX シグナルは単純にシグナルとも呼ばれるもので、広義ではプロセス間通信に属します。
シェルからシグナルを送信する時は kill コマンドを使用し、終了の時は SIGTERM、強制終了の時は SIGKILL、設定ファイルを読み込ませたい場合は SIGHUP、割り込みの時は SIGINT、タイマー終了時には SIGALRM を使用します。
詳しいシグナル一覧は次の通り。
シグナル | 値 | 動作 | コメント |
SIGHUP | 1 | 終了 | 制御端末(controlling terminal)のハングアップ検出、 または制御しているプロセスの死 |
SIGINT | 2 | 終了 | キーボードからの割り込み (Interrupt) |
SIGQUIT | 3 | Core | キーボードによる中止 (Quit) |
SIGILL | 4 | Core | 不正な命令 |
SIGABRT | 6 | Core | abort からの中断 (Abort) シグナル |
SIGFPE | 8 | Core | 浮動小数点例外 |
SIGKILL | 9 | 終了 | Kill シグナル |
SIGSEGV | 11 | Core | 不正なメモリー参照 |
SIGPIPE | 13 | 終了 | パイプ破壊:読み手の無いパイプへの書き出し |
SIGALRM | 14 | 終了 | alarm からのタイマーシグナル |
SIGTERM | 15 | 終了 | 終了 (termination) シグナル |
SIGUSR1 | 30,10,16 | 終了 | ユーザー定義シグナル 1 |
SIGUSR2 | 31,12,17 | 終了 | ユーザー定義シグナル 2 |
SIGCHLD | 20,17,18 | 無視 | 子プロセスの一時停止 (stop) または終了 |
SIGCONT | 19,18,25 | 再開 | 一時停止 (stop) からの再開 |
SIGSTOP | 17,19,23 | 停止 | プロセスの一時停止 (stop) |
SIGTSTP | 18,20,24 | 停止 | 端末より入力された一時停止 (stop) |
SIGTTIN | 21,21,26 | 停止 | バックグランドプロセスの端末入力 |
SIGTTOU | 22,22,27 | 停止 | バックグランドプロセスの端末出力 |
シグナル SIGKILL と SIGSTOP はキャッチ、ブロック、無視できない。
kill コマンドでシグナル送信
kill コマンドでシグナルを送信する時は、上記の「SIG」の部分を省略し、次のように行う。(SIGTERM を送信する場合)
kill -TERM プロセス番号 |
trap コマンドでシグナル受信
trap コマンドでシグナルを受信する場合は次のように行う。(SIGINT を受信する場合)
trep ‘受信コマンド’ SIGINT |
少し特殊なので実例を示す。
シグナルトラップを設定し、端末から Ctrl + c で SIGINT を送信。
$ trap ‘( echo “痛っ!” )’ SIGINT 痛っ!$ ^C $ |
シグナルトラップを設定し、10秒後に kill コマンドで SIGALRM を送信。
$ trap ‘( echo “時間だよ” )’ SIGALRM $ export SHELL_PID=$$; ( sleep 10; kill -ALRM ${SHELL_PID} )& [1] 187847 時間だよ$ [1]+ 終了 ( sleep 10; kill -ALRM ${SHELL_PID} ) $ |
Ctrl + c での SIGINT を無視したい場合。(シェルスクリプトなどで、Ctrl + c を無視する場合などに使用する)
trap ” SIGINT |
※ シングルコーテーション「’」が連続している事に注意