bashのシグナルハンドラ内でシグナルを特定する
シェルスクリプトのシグナルハンドラ内で受け取ったシグナルが何なのか知りたいことあると思います。しかし、単純に trap cleanup INT TERM ERR EXIT PIPE
とするだけでは、cleanup関数内で受け取ったシグナルの種類を知ることができません。そこで、以下のようにすればシグナルの種類を知ることができます。
#!/bin/bash
set -Eeuo pipefail
cleanup() {
echo "Trapped signal: $1"
# script cleanup here
}
trap_sig() {
for sig ; do
trap "cleanup $sig" "$sig"
done
}
trap_sig INT TERM ERR EXIT PIPE
# your script below
ループを回してtrapしたいシグナル毎にtrapを呼び出しています。
bashのテンプレートが話題になっていたのでなんとなく思い出したので書いてみました。
このテクニック自分で編み出したわけではなくて、出典を思い出してみると以下のstackoverflowで知ったようでした。
https://stackoverflow.com/questions/9256644/identifying-received-signal-name-in-bash