我有一个脚本可以执行这些操作。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]