次の単純な bash スクリプトがあります。
#!/bin/bash
set -o pipefail
set -o errtrace
set -o errexit
PROGNAME=$0
trap 'echo "${PROGNAME} recieved signal EXIT" | mailx -s "EXIT" "someone@anywhere.com"' EXIT
trap 'echo "${PROGNAME} recieved signal SIGHUP" | mailx -s "SIGHUP" "someone@anywhere.com"' SIGHUP
trap 'echo "${PROGNAME} recieved signal SIGINT" | mailx -s "SIGINT" "someone@anywhere.com"' SIGINT
trap 'echo "${PROGNAME} recieved signal SIGQUIT" | mailx -s "SIGQUIT" "someone@anywhere.com"' SIGQUIT
trap 'echo "${PROGNAME} recieved signal SIGTERM" | mailx -s "SIGTERM" "someone@anywhere.com"' SIGTERM
sleep 1000
コマンド ラインからこのスクリプトを実行すると、次のようになります。
./test_script.sh
次に、CTRL+CI を送信してスクリプトを中断し、2 つの電子メールを取得します。「受信シグナル EXIT」というメッセージを含むもの。もう一方には、「シグナル SIGINT を受信しました」というメッセージが含まれています。
ただし、このスクリプトを PBS ジョブとして実行すると、次のようになります。
qsub test_script.sh
そして、1、2 分待って、送信されたジョブで qdel を実行します。「受信シグナル EXIT」を含む電子メールしか受信しません。また、受信したシグナル SIGTERM を示す電子メールを受け取ることも期待していましたが、qdel のマニュアル ページには次のように記載されているためです。
A batch job being deleted by a server will be sent a SIGTERM signal following by a SIGKILL signal
誰かがこれがなぜなのか知っていますか? 理想的には、スクリプト内の何かが 0 以外の終了コードを返したときにメールを受信したいのですが、たとえば SIGINT や SIGTERM が原因でスクリプトが予想よりも早く終了したときにも別のメールを受信したいと考えています。
行を変更すると、いくつかの追加情報が表示されます。
trap 'echo "${PROGNAME} recieved signal EXIT" | mailx -s "EXIT" "someone@anywhere.com"' EXIT
に
trap 'echo "${PROGNAME} recieved signal EXIT, last command was ${BASH_COMMAND}" | mailx -s "EXIT" "someone@anywhere.com"' EXIT
最後に実行されたコマンドが「mailx -s "SIGTERM" "someone@anywhere.com"」であり、「sleep 1000」ではないことがわかります。したがって、SIGTERM シグナルがキャッチされるケースのようですが、後続のトラップ コマンドはキャッチされます。 PBS ジョブでは機能しません...