コンテンツにスキップ

Top

シェルスクリプトでシグナル(Ctrl+C)を拾って処理をする方法

trapコマンドを使えばできる。

trap '関数名' トラップするシグナル番号

シグナル番号は、Ctrl+cの場合はSIGINTなので2。
なので2だけ書いとけばいいけどぐぐったら 1 2 3 15 の4つを指定している人が多いのでパクった。

1:SIGHUP:端末が死んだとき
2:SIGINT:いわゆるCtrl+cのやつ
3:SIGQUIT:Ctrl+\ 。使ったことない。
15:SIGTERM:いわゆるkillとかkillallのときに飛んでくるやつ。強制殺しの9とは違う。

9(強制終了)は?と思うかもしれないが、 先に書いておくがkill -9(強制終了)は拾えない。

#!/bin/bash

function func() {
    status=$?
    echo "finish!"
    exit $status
}

trap 'func' 1 2 3 15

# 無限ループ
while true
do
    sleep 1
    echo "."
done

これを実行してCtrl+Cすると以下のようにecho がでる。

$ ./hoge.sh
.
.
.
finish!

が、trapのシグナル番号に9を追加して、kill -9 (プロセスID)をしてもfinish!はでない。

$ ./hoge.sh
.
.
.
強制終了

よって、kill -9 対策はできない。

以上!