おそらくはそれさえも平凡な日々

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

created at
last modified at

2021-01-20T22:48:45+0900

comments powered by Disqus