Bash 脚本出现错误时发出警报

Bash 脚本出现错误时发出警报

我有一个脚本可以执行这些操作。ls、cp、mv 我希望如果任何命令失败,这应该通过电子邮件以及成功竞争后发出警报。有什么想法吗?我可以调整电子邮件警报,但想知道如何检查错误和成功尝试。

答案1

您可以使用“&&”连续运行命令,让一系列命令持续执行直至“失败”;每个命令都返回“true”,从而导致以下命令运行。然后使用“||”在失败时运行命令,例如:

#!/bin/bash

cp foo bar \
  && mv bar bar{,.bak} \
  && echo "good so far" \
  && ls file123 | tee -a /tmp/msg.txt \
  && mailx -u user -s "success" -f /tmp/msg.txt \
  ||  mailx -u user -s "failure" -f ~/err.txt

由于这可能会变得混乱,因此可以使用以下函数

#!/bin/bash

do_work() {
  mv... || return 1
  cp... || return 1
  return 0
}

report() {
  [ "$1" = "ok" ] && mailx ....
  [ "$1" != "ok" ] && mailx -s "$1" ....
  return 0
}

do_work \
  && report ok 
  || report err

此外,继续上面的例子,您可以通过脚本中的“陷阱”添加综合规则,如果脚本中的任何时候返回任何类型的错误状态(包括在脚本运行时接收到 control-c(中断)信号),该规则将始终执行某些命令:

#!/bin/bash
tmp=/tmp/msg.$$.txt

# Cleanup: delete tmp files on exit. On any error, trap and exit... then cleanup
trap 'echo "cleaning up tmpfiles..." && rm $tmp >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15

...

do_work && exit 0

(免责声明……上面显示的命令是通用伪代码,只是从内存中输入的,并没有运行它们。肯定存在拼写错误。)

答案2

Bash 没有针对此类内容的任何内置警报,您需要通过检查变量$?(保存最后运行命令的退出代码)并对其采取行动将其写入脚本中。

一个非常简单的检查,电子邮件看起来应该是这样的:

if [ $? -ne 0 ]
then
    <send me email however you want to about failure>
else
    <send me email about success how ever you want> 
fi

请务必检查命令文档,以确保成功执行设置退出代码为 0。

答案3

您使用 mailwrap 命令包装器,在运行作为其参数的命令之前,它会接受一些选项来指定要向谁发送邮件。mailwrap 命令仅在有输出或脚本失败时才发送电子邮件。有许多变体,如果您不喜欢找到的那些,它们是您自己编写的好练习。

#!在脚本本身的行上,您使用,-e这样任何失败的命令管道都会导致脚本在该点中止。您也可以使用-u,在使用未设置的变量时中止。

命令失败不是中止脚本,您附加|| true,读作“或 true”,因此失败无关紧要。(更惯用的说法是,|| :这是同一件事)。

如果你想确切地知道通常静默的命令失败的位置,可以使用不发送电子邮件的 mailwrap 命令只是因为输出到 stderr 然后您-v在 shell#!行上使用,来跟踪即将运行的命令。

答案4

或者将脚本的输出通过管道传输到邮件中,无论结果如何,直到您对它的运行感到满意为止。

就像是:

(cat $resultofscript) | mailx -s "Subject" [email protected]

相关内容