Cron

僅當 Git 拋出真正的錯誤時才發送 cron 輸出

  • January 1, 2013

在一台伺服器上存在一個 Git 儲存庫,我們希望在另一台伺服器上為其生成 doxygen 輸出。以下命令對我有用,但每次更新 repo 時都會發送一封郵件,因為 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 將無濟於事。

過度依賴 crond 的郵件功能可能會產生各種問題。根據您的 crond,它們可能不夠靈活。

例如,通常,正如您所描述的,不能配置只有退出狀態!= 0 應該觸發 stdout/stderr 的郵件。另一個問題是,例如,Solaris crond 對其擷取/郵件的輸出有(相對)較小的大小限制。

因此,對於這種情況,我建議編寫一個小的幫助腳本來呼叫命令並將輸出重定向到臨時日誌文件。它可以在內部跟踪所有程序的退出狀態,如果一個是 != 0 它:

  • 將日誌文件 cat 到標準輸出
  • 通過命令行郵件工具郵寄
  • 或者只輸出包含日誌文件位置的簡短診斷

就像是:

$ 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

引用自:https://unix.stackexchange.com/questions/59705