2

次の単純な 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 ジョブでは機能しません...

4

1 に答える 1

2

これはかなり紛らわしいですが、問題は、スクリプトがシグナルをトラップしていて、スクリプトを実行しているシェルがトラップしていないことです。これを解決するには、次の 2 つの方法があります。

  1. ママの設定ファイルで $exec_with_exec オプションを使用します。これにより、pbs_mom が (exec を使用して) 少し異なる方法でジョブを起動し、問題を処理します。構成ファイルを変更するには管理者権限が必要ですが、このパラメーターはここに記載されています。
  2. シグナルもトラップするようにシェルを構成します (これにより、意図しない結果が生じる可能性があります)。
于 2013-12-11T22:50:36.080 に答える