(便利な小技)trapコマンドを使う

投稿者: | 2019年1月26日

みなさんこんにちは。ヒロウミです。

普段サーバ上でちょっとした作業をするときに書いたりするシェルスクリプトですが、trapコマンドを使うと便利な場面があったので調べたことをメモっときます。

trapコマンドを使うとシェルスクリプトが受け取ったシグナルに応じた処理を実行することができます。細かいことはマニュアルに書いているのでそちらを確認してください。それではちょっとしたサンプルを書きます。

# 「Ctrl-C」などでシグナルを送るとログファイルを削除します

# cat trap_sample_01.sh
====================================================================
#!/bin/bash

trap 'rm -f /tmp/$.log; echo "delete logfile" ;exit 1' 1 2 3 15

touch /tmp/$.log

for i in {1..15}
do
    sleep 1
    echo "[$i] hello trap command!!" >> /tmp/$.log
done
====================================================================

# 「Ctrl-C」などのシグナルを無視します。途中で中断させたくない処理の場合に利用できるかもしれません
# しかし、通常のシグナルの動作を無視するのはあまり好ましくないと思うのでどうしても必要な場面に限った方が良いと思います
# キルシグナル(SIGKILL)は無視できません

# cat trap_sample_02.sh
====================================================================
#!/bin/bash

trap 'echo "skip signal"' 1 2 3 15

for i in {1..15}
do
    sleep 1
    echo "[$i] hello trap command!!"
done
====================================================================
# コマンドのエラーも捕捉できます
# 「echo "command failed"」の部分を書き換えて、軽い例外キャッチ的に利用できるかもしれません
# ここまでするなら他のスクリプト言語で書いた方が良いと思いますが

# cat trap_sample_03.sh
====================================================================
#!/bin/bash

trap 'echo "command failed";exit 1' 'ERR'

for i in {1..15}
do
    sleep 1
    echo "[$i] hello trap command!!"

    if [ "$i" -eq "10" ];then
        ### 失敗すると困ってしまうコマンド等
        ls aaaaaaaaaaaaaaaaaaaaaaa
    fi
done
====================================================================

killコマンドと合わせてシグナルの動作を確認して遊んでみるのも良いかもしれませんね。

詳しいサイト:

シグナルと trap コマンド