Cron : 이메일에만 오류가 발생합니까?


38

마지막으로 셸 스크립트를 통해 데이터에 현실적인 백업 일정을 설정했습니다.이 스크립트는 cron이 좁은 간격으로 처리합니다. 불행히도 CRON이 실행될 때마다 빈 이메일이 계속 전송됩니다.

무언가 잘못되었을 때만 CRON이 이메일을 보내도록 할 수 있습니까? 내 TAR의도대로 실행되지 않습니까?

다음은 현재 crontab을 설정하는 방법입니다.

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

고마워요!

답변:


53

이상적으로 모든 것이 예상대로 진행되면 백업 스크립트가 아무 것도 출력하지 않고 무언가 잘못되었을 때만 출력을 생성하는 것이 좋습니다. 그런 다음 MAILTO 환경 변수를 사용하여 스크립트에서 생성 된 출력을 전자 메일 주소로 보내십시오.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

스크립트가 일반적으로 출력을 생성하지만 cron에서 신경 쓰지 않으면 / dev / null로 보내면 stderr에 무언가가 쓰여질 때만 이메일로 보내집니다.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
이것은 거의 이상적이지 않습니다. 일반적으로 명령이 0이 아닌 오류 코드로 종료 될 때 전체 출력 (stdout + stderr)이 전자 우편으로 보내지기를 원합니다. 그렇지 않으면 일반적으로 최소한 stdout을 사용하는 것이 좋습니다. 나에게 이것은 cron의 디자인 결함입니다.
Witiko

3
@Witiko 동의합니다; 이 문제를 해결하려고했습니다. 당신이 cron 명령을 만들 수 있다고 생각 /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)합니까?
Daniel H

22

cronic wrapper 스크립트를 사용 하는 것은 좋은 생각입니다. 그것을 사용하기 위해 당신은 당신의 스크립트를 변경할 필요가 없습니다.

대신에:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

하다:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

간단히 말하면; 모든 것이 순조롭게 진행되면 (종료 상태 0) 자동으로 실행되지만, 그렇지 않으면 상세하게보고하고 cron이 메일보고를 처리하게합니다.

https://habilis.net/cronic/에 대한 자세한 정보 .


문제가 잘못된 cron 라인에 지나지 않고 cron이 지시에 따라 정확히 수행하는 경우 어떻게 도움이되는지 알 수 없습니다.
John Gardeniers

3
@JohnGardeniers 때로는 오류없이 출력하기 때문에 도움이됩니다.
Mikhail

11
또는 chronic로부터 moreutils패키지 joeyh.name/code/moreutils
블라디미르 Panteleev

4

당신은 (그런데) 있어야 성공할 cron때에도 항상 이메일을 보내도록 지시 하고 /bin/backup.sh있습니다 /usr/local/bin. | mail -s "Backup status" email@example.com부품을 생략하면 출력이있을 때만 이메일이 전송됩니다. 아마도 (에 따라 cron) crontab 파일에서 이메일 주소를 mail로 지정할 수 있습니다.

자세한 내용은

man 5 crontab

3

당신은 지시한다 stderr둘 anmd을 stdout하고 stderr.

사용 1> /dev/null하지 않으면 2>&1괜찮습니다. 또한 백업 스크립트에서 오류를 올바르게보고해야 할 수도 있습니다.


3

몇 년 동안 성공적으로 활용 한 또 다른 변형은 다음과 같습니다. 출력을 캡처 하여 오류시에만 출력 하여 이메일을 트리거합니다. 임시 파일이 필요하지 않으며 모든 출력을 유지합니다 . 중요한 부분은 2>&1STDERR을 STDOUT으로 리디렉션 하는 것 입니다.

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

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

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

( 전체 crontab 파일에 대해 MAILTO = xxxx 를 설정하여 주소를 변경할 수도 있습니다 )

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로 출력 되더라도 여전히 이메일을받을 수 있기 때문입니다.

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