![仅当 Git 抛出真正的错误时才发送邮件 cron 输出](https://linux22.com/image/44212/%E4%BB%85%E5%BD%93%20Git%20%E6%8A%9B%E5%87%BA%E7%9C%9F%E6%AD%A3%E7%9A%84%E9%94%99%E8%AF%AF%E6%97%B6%E6%89%8D%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%20cron%20%E8%BE%93%E5%87%BA.png)
一台服务器上存在一个 Git 存储库,我们希望在另一台服务器上为其生成 doxygen 输出。以下命令对我有用,但缺点是每次更新存储库时都会发送邮件,因为 Git 使用 stderr 进行进度报告(通过全能的 Oracle 进行快速搜索表明他们认为这种行为是一种功能)。
59 * * * * cd FQNameOfRepo; git pull 1>/dev/null; make doc-all 1>/dev/null; cp doc/latex/refman.pdf doc/html/
虽然我可以grep
通过 Git 的 stderr 输出或将其与已知字符串进行比较,但这似乎是错误的。我是否使用了错误的 Git 命令?如何正确完成此操作?
为了澄清起见,我仍然希望此命令在发生真正错误时发送邮件,因此简单地重定向 stderr 不会有帮助。
答案1
过度依赖 crond 的邮件功能可能会产生各种问题。根据您的 crond,它们可能不够灵活。
例如,正如您所描述的,通常无法配置只有退出状态 != 0 才能触发 stdout/stderr 的邮件发送。另一个问题是,例如,Solaris crond对其捕获/邮件的输出有(相对)较小的大小限制。
因此,对于这种情况,我建议编写一个小的帮助程序脚本来调用命令并将输出重定向到临时日志文件。它可以在内部跟踪所有程序的退出状态,如果其中一个为 != 0,则:
- cat 将日志文件发送到 stdout
- 通过命令行邮件工具邮寄
- 或者只输出简短的诊断信息,其中包括日志文件的位置
就像是:
$ cat helper.sh
set -u
set -e
# setup log-file $LOG
# ...
cd FQNameOfRepo
set +e
git pull 1>/dev/null 2>> $LOG
r1=$?
make doc-all 1>/dev/null 2>> $LOG
r2=$?
cp doc/latex/refman.pdf doc/html/ 2>> $LOG
r3=$?
set -e
if [ $r1 -ne 0 -o $r2 -ne 0 -o $r3 -ne 0 ]; then
# do some stuff, print/mail $LOG or something like that, etc.
# ...
exit 23
fi
答案2
将输出存储在变量或临时文件中,仅当返回状态非零时才打印它。
59 * * * * errors=$( { cd FQNameOfRepo && git pull && make doc-all && cp doc/latex/refman.pdf doc/html/; } 2>&1 >/dev/null) || { ret=$?; echo "$errors"; exit $ret; }
(您可能想将这段相当长的俏皮话放入脚本中。)
答案3
您可以使用 rsyslog。它有一个邮件输出模块。设置一个过滤器模块,捕获 git 存储库中的特定错误并将其路由到邮件目的地。