コンテンツにスキップ

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(強制終了)は拾えない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/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 がでる。

1
2
3
4
5
$ ./hoge.sh
.
.
.
finish!

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

1
2
3
4
5
$ ./hoge.sh
.
.
.
強制終了

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

以上!