シェルスクリプトでシグナル(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 対策はできない。
以上!