답변:
이상적으로 모든 것이 예상대로 진행되면 백업 스크립트가 아무 것도 출력하지 않고 무언가 잘못되었을 때만 출력을 생성하는 것이 좋습니다. 그런 다음 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
/bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)
합니까?
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/에 대한 자세한 정보 .
몇 년 동안 성공적으로 활용 한 또 다른 변형은 다음과 같습니다. 출력을 캡처 하여 오류시에만 출력 하여 이메일을 트리거합니다. 임시 파일이 필요하지 않으며 모든 출력을 유지합니다 . 중요한 부분은 2>&1
STDERR을 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로 출력 되더라도 여전히 이메일을받을 수 있기 때문입니다.