오류가 없으면 cron 이메일을 비활성화 하시겠습니까?


12

오류가있는 경우 어떻게 cron으로부터 이메일을받을 수 있습니까?

압도적으로 대다수의 경우, 작업은 잘 진행될 것입니다. 나는 실제로 출력에 신경 쓰지 않습니다.

내가 알고 / 필요한 장애가 드문 경우입니다.

나는 procmail을 사용할 수있다. 그러나 내가 설명하고있는 것이 "정확하게"cron 외부 관리가 가능한지 확실하지 않다.


크론 자체가 실행되지 않으면 어떻게됩니까? 아니면 기계가 오프라인입니까? 그래서 나는 cron의 이메일을 귀찮게하고 전용 cron 모니터링 서비스를 사용하지 않습니다. WDT.io의 일부이므로 권장합니다.
Christian Pekeler 2016 년

답변:


8

출력을 관리하지 않으면 작업의 STDOUT을 경로 재지 /dev/null정하고 STDERR이 메일을 통해 보내지도록 할 수 있습니다 ( MAILTO환경 변수 사용).

예를 들어,

...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null

STDERR (STDERR 사용)에서만 출력 될 때 메일을 보내고 STDOUT을 버립니다.

이것은 물론 프로그램이 STDERR로 작성되었을 때 실패했다고 가정합니다. 항상 그런 것은 아닙니다. 프로그램을 제어 할 수 있으면 그렇게 할 수 있습니다. 복잡한 경우에는 명령을 실행하고 그에 따라 메일을 보내는 일종의 래퍼를 작성해야합니다. 그리고 랩퍼를 cron작업 으로 넣으십시오 .


1
이 방법의 단점은 실패했을 때 STDERR 출력 만 가져 오므로 전체 출력보다 진단을 어렵게 만들 수 있습니다.
plugwash

11

moreutilschronic명령은 명령이 실패하지 않으면 자동으로 명령을 실행합니다.

매뉴얼에서 인용 :

chronic은 명령을 실행하고 명령이 실패한 경우 (0이 아닌 종료 또는 충돌)에만 표준 출력 및 표준 오류가 표시되도록 정렬합니다. 명령이 성공하면 외부 출력이 숨겨집니다.

만성의 일반적인 용도는 크론 작업을 실행하는 것입니다. 명령을 조용히 유지하려고 시도하고 성공할 때 우연한 출력이 포함 된 메일을 처리하고 실패 할 경우 충분한 출력을 상세하게 표시하지 않고 항상 상세하게 실행하고 만성적 인 방식으로 성공적인 출력을 숨길 수 있습니다.


8

오류가있는 경우 어떻게 cron으로부터 이메일을받을 수 있습니까?

호출 된 프로세스의 리턴 코드가 0이 아니거나 추적 오류가 아닌 경우 cron 출력을 먹는 쉘 스크립트 인 cronic으로 cron 호출을 랩핑 할 수 있습니다 .

Cronic을 사용하려면 스크립트를 적절한 위치 (예 :)로 다운로드하십시오 /usr/local/bin. 귀하의 crontab 항목은 스크립트 (예를 들어 경로로 시작되어야합니다 /usr/local/bin/cronic단순히), 또는 cronic귀하가 제공, PATH적절하게 설정되어 있습니다.

"오류"는 질문에 잘못 정의 된 용어이며 신중하게 정의해야합니다. Cronic을 유용하게 사용하려면 오류 조건을 정의하는 방법 중 하나로 Cronic 보고서 오류로 랩핑 한 작업을 확인해야합니다. 텍스트 문자열을 작성하는 등의 암시적인보고 방법은 STDOUT이를 크론 또는 다른 크론보고 메커니즘과 호환되도록 추가로 고려해야합니다.

크론 사이트에서 링크 된 다른 래퍼도 사용할 수 있습니다.


1
인가 cronic와 관련된 chronic, 또는 단지 우연의 일치인가?
Toby Speight

@TobySpeight 우연의 일치입니다. 이전 답변 에서 제안한 것처럼 Perl 스크립트는 cronicbash로 구현됩니다 . chronic
Cosmic Ossifrage 2016 년

4

캡처 출력을하고 그것을 밖으로 인쇄 - 여기가 성공적으로 여러 해 동안 활용 한 또 다른 변형 만 에러가 . 임시 파일이 필요하지 않으며 모든 출력을 유지합니다 . 중요한 부분은 2>&1STDERR을 STDOUT으로 리디렉션 하는 것 입니다.

기본 크론 메일러 설정을 통해 전체 출력을 보냅니다.

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

동일하지만 특정 주소와 주제가있는 경우 :

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

오류에 대해 여러 작업을 수행하고 이메일에 추가 할 수도 있습니다.

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

이것은 간단한 명령에 효과적입니다. 복잡한 파이프 ( find / -type f | grep -v bla | tar something-or-other)를 다루는 경우 명령을 스크립트로 옮기고 위에서 언급 한 접근법을 사용하여 스크립트를 실행하는 것이 좋습니다. 파이프의 일부가 STDERR로 출력 되더라도 여전히 이메일을받을 수 있기 때문입니다.


당신은 넣어해야 $OUTPUT인용 부호 : "$OUTPUT".
G-Man, 'Reinstate

@ G-Man 페어 포인트는 항상 출력에 "-n"또는 이와 유사한 것이 포함될 수 있습니다.
Akom

0

나는 이것을 완전히 생각하지는 않았지만

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

일반적인 경우 모든 파일을 임시 파일로 리디렉션 mktemp하고 (고유 한 파일 이름을 얻는 데 사용하고 싶을 수 있음 ) 파일이 성공한 경우 파일을 삭제 한 다음 파일이 cat여전히 존재하는 경우 해당 내용을 다시 삭제 합니다 (예 : yourthing.sh가 종료 됨) cron 메일러가 픽업해야합니다.

메모리가 제공되면 출력이 없으면 cron이 이미 아무것도 보내지 않으므로 로그 파일이 비어 있거나 존재하지 않으면 아무 일도 일어나지 않습니다. 오류 메시지를 리디렉션합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.