Esiste un repository Git che si trova su un server, vogliamo generare un output doxygen per esso su un server diverso. Il seguente comando funziona per me ma ha lo svantaggio di inviare una mail ogni volta che il repository viene aggiornato perché Git usa stderr per la segnalazione dei progressi (una rapida ricerca tramite l'onnipotente Oracle suggerisce che considerino questo comportamento una funzionalità).
59 * * * * cd FQNameOfRepo; git pull 1>/dev/null; make doc-all 1>/dev/null; cp doc/latex/refman.pdf doc/html/
Mentre potevo grep
attraverso l'output stderr di Git o confrontarlo con una stringa nota questo sembra sbagliato. Sto usando il comando Git sbagliato? Come si farebbe correttamente?
Per chiarimenti, voglio comunque che questo comando invii una mail se si verifica un errore reale, quindi il semplice reindirizzamento di stderr non sarà di aiuto.
Risposta accettata:
Fare troppo affidamento sulle capacità di mailing di crond può causare vari problemi. A seconda del tuo crond, forse non sono abbastanza flessibili.
Ad esempio, spesso, come hai descritto, non è possibile configurare che solo uno stato di uscita !=0 debba attivare l'invio di stdout/stderr. Un altro problema è che, ad esempio, il crond di Solaris ha un limite di dimensioni (relativamente) piccolo sull'output che cattura/invia.
Pertanto, per tali situazioni, suggerisco di scrivere un piccolo script di supporto che chiama i comandi e reindirizza l'output a un file di registro temporaneo. Può tenere traccia internamente dello stato di uscita di tutti i programmi e se uno è !=0 può essere:
- cat the log-file su stdout
- invialo tramite uno strumento di posta a riga di comando
- o semplicemente emetti una breve diagnostica che includa la posizione del file di log
Qualcosa come:
$ 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