bash を使おう!④ : UNIX シグナル

今回は UNIX シグナルについて説明します。


UNIX シグナルとは

UNIX シグナルは単純にシグナルとも呼ばれるもので、広義ではプロセス間通信に属します。

シェルからシグナルを送信する時は kill コマンドを使用し、終了の時は SIGTERM、強制終了の時は SIGKILL、設定ファイルを読み込ませたい場合は SIGHUP、割り込みの時は SIGINT、タイマー終了時には SIGALRM を使用します。

詳しいシグナル一覧は次の通り。

シグナル動作コメント
SIGHUP1終了制御端末(controlling terminal)のハングアップ検出、
または制御しているプロセスの死
SIGINT2終了キーボードからの割り込み (Interrupt)
SIGQUIT3Coreキーボードによる中止 (Quit)
SIGILL4Core不正な命令
SIGABRT6Coreabort からの中断 (Abort) シグナル
SIGFPE8Core浮動小数点例外
SIGKILL9終了Kill シグナル
SIGSEGV11Core不正なメモリー参照
SIGPIPE13終了パイプ破壊:読み手の無いパイプへの書き出し
SIGALRM14終了alarm からのタイマーシグナル
SIGTERM15終了終了 (termination) シグナル
SIGUSR130,10,16終了ユーザー定義シグナル 1
SIGUSR231,12,17終了ユーザー定義シグナル 2
SIGCHLD20,17,18無視子プロセスの一時停止 (stop) または終了
SIGCONT19,18,25再開一時停止 (stop) からの再開
SIGSTOP17,19,23停止プロセスの一時停止 (stop)
SIGTSTP18,20,24停止端末より入力された一時停止 (stop)
SIGTTIN21,21,26停止バックグランドプロセスの端末入力
SIGTTOU22,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

※ シングルコーテーション「’」が連続している事に注意

Facebooktwitterfoursquare

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です