あるサーバー上にGitリポジトリが存在するため、別のサーバー上でdoxygen出力を生成したいと考えています。次のコマンドは私には機能しますが、Gitが進行状況のレポートにstderrを使用するため、リポジトリが更新されるたびにメールを送信するという欠点があります(全能のオラクルによるクイック検索は、この動作を機能と見なしていることを示しています)。
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のメール機能に依存しすぎると、さまざまな問題が発生する可能性があります。 cronによっては、柔軟性が十分でない可能性があります。
たとえば、多くの場合、説明したように、終了ステータス!=0のみがstdout/stderrのメール送信をトリガーするように構成することはできません。もう1つの問題は、たとえば、Solaris crondには、キャプチャ/メール送信する出力に(比較的)小さいサイズ制限があることです。
したがって、このような状況では、コマンドを呼び出して出力を一時ログファイルにリダイレクトする小さなヘルパースクリプトを作成することをお勧めします。すべてのプログラムの終了ステータスを内部的に追跡でき、いずれかが!=0の場合は、次のいずれかになります。
- ログファイルを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