【问题标题】:Trap command in script works when called from CLI but not when used in a PBS job脚本中的 Trap 命令在从 CLI 调用时有效,但在 PBS 作业中使用时无效
【发布时间】:2013-11-26 14:05:18
【问题描述】:

我有以下简单的 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+C 中断脚本,我收到两封电子邮件。一个包含消息:“收到信号退出”。另一个包含消息“received signal SIGINT”。

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

qsub test_script.sh

然后等待一两分钟,对提交的作业执行 qdel,我只收到一封包含“received 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" "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 信号被捕获,但随后trap 命令不适用于 PBS 作业...

【问题讨论】:

  • 只是一个大胆的猜测:如果qsub 使用sh 而不是bash 执行脚本,它可能不接受SIGINT 作为有效的信号名称,而是需要INT

标签: bash unix error-handling pbs bash-trap


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2020-09-08
    • 2023-03-19
    • 2014-08-02
    • 2021-11-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多