我有以下简单的 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 中断脚本获取两封电子邮件。一个包含消息:“收到信号退出”。另一个包含消息“收到信号 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 信号被捕获的情况,但随后的陷阱命令确实不适用于 PBS 工作...