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

时间:2013-11-26 14:05:18

标签: 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" "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来中断脚本我收到两封电子邮件。一个包含消息:“收到信号退出”。另一个包含消息“收到信号SIGINT”。

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

qsub test_script.sh

然后等待一两分钟并在提交的作业上执行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。 / p>

一些其他信息,当我修改该行时:

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“而不是”睡眠1000“。所以看起来似乎是SIGTERM信号被捕获的情况,但随后trap命令对PBS作业不起作用......

1 个答案:

答案 0 :(得分:2)

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

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