bash - 脚本中的陷阱命令在从 CLI 调用时有效,但在 PBS 作业中使用时无效

标签 bash unix error-handling pbs bash-trap

我有以下简单的 bash 脚本:

#!/bin/bash

set -o pipefail
set -o errtrace
set -o errexit

PROGNAME=$0

trap 'echo "${PROGNAME} recieved signal EXIT" | mailx -s "EXIT" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="582b37353d37363d183936212f303d2a3d763b3735" rel="noreferrer noopener nofollow">[email protected]</a>"' EXIT
trap 'echo "${PROGNAME} recieved signal SIGHUP" | mailx -s "SIGHUP" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fc8f939199939299bc9d92858b94998e99d29f9391" rel="noreferrer noopener nofollow">[email protected]</a>"' SIGHUP
trap 'echo "${PROGNAME} recieved signal SIGINT" | mailx -s "SIGINT" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="84f7ebe9e1ebeae1c4e5eafdf3ece1f6e1aae7ebe9" rel="noreferrer noopener nofollow">[email protected]</a>"' SIGINT
trap 'echo "${PROGNAME} recieved signal SIGQUIT" | mailx -s "SIGQUIT" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="87f4e8eae2e8e9e2c7e6e9fef0efe2f5e2a9e4e8ea" rel="noreferrer noopener nofollow">[email protected]</a>"' SIGQUIT
trap 'echo "${PROGNAME} recieved signal SIGTERM" | mailx -s "SIGTERM" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fd8e929098929398bd9c93848a95988f98d39e9290" rel="noreferrer noopener nofollow">[email protected]</a>"' SIGTERM

sleep 1000

当我从命令行运行此脚本时:即

./test_script.sh

然后通过发送 CTRL+C 中断脚本,我收到两封电子邮件。其中包含消息:“收到信号 EXIT”。另一个包含消息“收到信号 SIGINT”。

但是,当我将此脚本作为 PBS 作业运行时:

qsub test_script.sh

然后等待一两分钟并对提交的作业执行 qdel,我只收到一封包含“recieved signal 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" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="02716d6f676d6c6742636c7b756a6770672c616d6f" rel="noreferrer noopener nofollow">[email protected]</a>"' EXIT

trap 'echo "${PROGNAME} recieved signal EXIT, last command was ${BASH_COMMAND}" | mailx -s "EXIT" "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d8abb7b5bdb7b6bd98b9b6a1afb0bdaabdf6bbb7b5" rel="noreferrer noopener nofollow">[email protected]</a>"' EXIT

我可以看到最后执行的命令是“mailx -s "SIGTERM""[email protected] ”而不是“sleep 1000”。因此,似乎确实是 SIGTERM 信号被捕获的情况,但后续的 trap 命令不适用于 PBS 作业...

最佳答案

这相当令人困惑,但问题是脚本正在捕获信号,而运行脚本的 shell 却没有。有两种方法可以解决这个问题:

  1. 在 mom 的配置文件中使用 $exec_with_exec 选项。这使得 pbs_mom 启 Action 业的方式略有不同(使用 exec),它可以为您处理问题。您需要管理员权限才能更改配置文件,但此参数记录在here中.
  2. 配置 shell 来捕获信号(这可能会产生意想不到的后果)。

关于bash - 脚本中的陷阱命令在从 CLI 调用时有效,但在 PBS 作业中使用时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20219252/

相关文章:

php - 如何使用 Linux 或 PHP 将文件保持在 1000 行?

regex - awk/sed 帮助 - 如何查找包含逗号然后用双引号引起来的列?

linux - 如何将字符串名称与文件名匹配?

linux - 编写多个 sed 命令的更简洁的方法?

linux - 如何从 N 个多行文件中获取一个包含 N 行的输出文件?

unix - ps按开始时间排序结果

error-handling - iOS9 Storyboard 什么是未处理的 Action (handleNonLaunchSpecificActions)?

objective-c - iOS 中异常处理的正确方法是什么?

php - 基于PHP域的许可系统

java - 尝试从 bash 运行BehaviorSpace 实验时出错