Git에서 실제 오류가 발생한 경우에만 cron 출력을 이메일로 보내세요.

Git에서 실제 오류가 발생한 경우에만 cron 출력을 이메일로 보내세요.

한 서버에는 다른 서버에서 doxygen 출력을 생성하려는 Git 저장소가 있습니다. 다음 명령은 나에게 효과적이지만 Git은 진행 상황 보고를 위해 stderr을 사용하기 때문에 저장소가 업데이트될 때마다 이메일을 보내야 한다는 단점이 있습니다(전능한 Oracle을 통한 빠른 검색에 따르면 이 동작을 기능으로 간주하는 것으로 나타났습니다).

59 * * * * cd FQNameOfRepo; git pull 1>/dev/null; make doc-all 1>/dev/null; cp doc/latex/refman.pdf doc/html/

grepGit의 stderr을 통해 출력하거나 알려진 문자열과 비교할 수 있지만 이는 잘못된 것 같습니다. 잘못된 Git 명령을 사용하고 있습니까? 이를 올바르게 수행하는 방법은 무엇입니까?

명확히 하자면, 실제 오류가 발생할 때 이 명령이 메일을 보내길 원하므로 단순히 stderr를 리디렉션하는 것만으로는 도움이 되지 않습니다.

답변1

crond의 이메일 기능에 지나치게 의존하면 다양한 문제가 발생할 수 있습니다. 크론드에 따라 유연성이 충분하지 않을 수 있습니다.

예를 들어, 설명하신 대로 종료 상태 != 0만이 stdout/stderr 메일링을 트리거하도록 구성하는 것은 일반적으로 불가능합니다. 또 다른 문제는 예를 들어 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

답변2

출력을 변수나 임시 파일에 저장하고 반환 상태가 0이 아닌 경우에만 인쇄합니다.

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 저장소에서 특정 오류를 포착하고 이를 이메일 대상으로 라우팅하는 필터 모듈을 설정합니다.

관련 정보