我有一个脚本可以做。 ls,cp,mv我希望如果任何命令失败,应该通过电子邮件以及成功竞争后提醒。 任何想法? 我可以调整电子邮件警报,但想知道如何检查错误和成功的尝试。
您可以通过使用“&&”连续运行命令来继续执行一系列命令,直到“失败”。 每个命令返回“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
另外,继续上面的例子,你可以通过脚本中的'陷阱'来添加覆盖规则,如果在脚本的任何一点返回任何types的错误状态(包括接收一个控制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
(声明…上面显示的命令是通用的伪代码,只是从内存中input而不运行它们,确实存在错误。
Bash没有任何内置的提醒这个东西,你需要把它写入你的脚本通过检查$?
variables(保存上次运行命令的退出代码)并对其执行操作。
一个简单的检查,电子邮件会看起来像:
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。
在运行作为其参数的命令之前,您使用了一个mailwrap命令包装器,这个命令包装器会指定要发送邮件的用户。 如果有输出,或者脚本失败,mailwrap命令只发送电子邮件。 那里有很多变种,如果你不喜欢那些你发现的东西,那么他们就是很好的练习。
在#!
脚本本身的一行,你使用-e
,这样任何失败的命令pipe道都会导致脚本在该点中止。 您也可以使用-u
来放弃使用未设置的variables。
要使失败的命令不能中止脚本,请附加|| true
|| true
,读为“或真”,这样失败并不重要。 (更惯用的, || :
这是同样的事情)。
如果你想看到一个正常沉默的命令失败的确切位置,你可以使用一个mailwrap命令,它不会仅仅因为输出到stderr而发送电子邮件,然后你在shell #!
上使用-v
#!
行,跟踪命令,因为他们即将被运行。
或者将脚本的输出结果输出到一个邮件中,无论结果如何,直到你感到满意为止。
就像是:
(cat $resultofscript) | mailx -s "Subject" [email protected]