작업이 실패하면 crontab이 이메일을 보내지 않습니다

작업이 실패하면 crontab이 이메일을 보내지 않습니다

데비안에는 크론 작업이 있습니다:

1 * * * * /home/paradroid/bin/myscript.sh >/dev/null

MTA가 설치 및 구성되어 있고 스크립트에 구문 오류가 있으면 이메일을 받기 때문에 문제가 발생하면 항상 알림을 받을 것이라고 생각했습니다.

curl이 스크립트는 프록시를 통해 파일을 다운로드합니다. 프록시가 최근 만료되어 curl다운로드할 수 없습니다. 이는 스크립트의 마지막 명령이었으며 오류 코드 7로 종료되었습니다.

이 일이 발생하면 이메일을 받을 것이라고 생각했지만 그렇지 않았습니다.

스크립트의 구문 오류와 같은 경우 이메일 알림을 받지만 스크립트가 작업을 수행하지 못하고 오류 코드와 함께 종료되는 경우에는 이메일 알림을 받지 못하는 이유는 무엇입니까?

여기에 문제가 있습니까? 아니면 오류가 발생할 때 스크립트가 나에게 직접 이메일을 보내도록 해야 합니까 curl?

답변1

나는 귀하의 cron 이메일 설정이 모두 정확하고 이메일을 받고 있다고 가정합니다.

모든 stdout을 stdout으로 보내 /dev/null므로 오류 메시지를 인쇄하는 모든 항목은 이를 stderr로 출력해야 합니다. 스크립트의 모든 내용이 올바르게 출력되는지 확인하고 싶을 수도 있습니다.

때로는 모든 것을 표준 출력으로 보내는 타사 코드를 사용해야 할 때도 있습니다. 이 경우 나는 보통 오류 검사를 수행합니다. 예쁘지는 않지만 대부분의 쉘 스크립트도 마찬가지입니다.

답변2

Freenode의 일부 사람들과 이야기를 나눈 후, 한 개발자는 #curl약 10년 전(7.23.0 이전) 옵션 구문 분석 오류가 ( )를 ( )로 처리하여 를 포함한 모든 출력이 억제되는 버그가 있었다고 언급했습니다.curl-Ss--show-silent --show-error-s--silentstdout

해결책(7.23.0 이전)은 -sS대체 옵션이나 긴 옵션을 사용하는 것입니다.

이 불쾌한 버그는 나에게 많은 혼란을 야기했고 꽤 중요한 크론 작업이 내가 모르는 사이에 며칠 동안 실패하게 만들었습니다!

답변3

출력이 포함된 경우 Cron은 출력 스트림 stdout 및 stderr만 이메일로 보냅니다.

프로그램의 반환 코드에서 에코 조건을 실행하여 알림을 보내기 위해 cron을 트리거할 수 있습니다. 이는 프로그램이 오류 상태를 적절하게 설정한다고 가정합니다. 이는 || echo Failure status $?명령줄 끝에 추가하여 수행할 수 있습니다. 원하는 대로 메시지를 조정하세요. 긴 형식은 명령을 구문으로 래핑 if then fi하거나 명령이 실행된 후 반환 코드를 테스트하는 것입니다.

관련 정보