오류가있는 경우 어떻게 cron으로부터 이메일을받을 수 있습니까?
압도적으로 대다수의 경우, 작업은 잘 진행될 것입니다. 나는 실제로 출력에 신경 쓰지 않습니다.
내가 알고 / 필요한 장애가 드문 경우입니다.
나는 procmail을 사용할 수있다. 그러나 내가 설명하고있는 것이 "정확하게"cron 외부 관리가 가능한지 확실하지 않다.
오류가있는 경우 어떻게 cron으로부터 이메일을받을 수 있습니까?
압도적으로 대다수의 경우, 작업은 잘 진행될 것입니다. 나는 실제로 출력에 신경 쓰지 않습니다.
내가 알고 / 필요한 장애가 드문 경우입니다.
나는 procmail을 사용할 수있다. 그러나 내가 설명하고있는 것이 "정확하게"cron 외부 관리가 가능한지 확실하지 않다.
답변:
출력을 관리하지 않으면 작업의 STDOUT을 경로 재지 /dev/null
정하고 STDERR이 메일을 통해 보내지도록 할 수 있습니다 ( MAILTO
환경 변수 사용).
예를 들어,
...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null
STDERR (STDERR 사용)에서만 출력 될 때 메일을 보내고 STDOUT을 버립니다.
이것은 물론 프로그램이 STDERR로 작성되었을 때 실패했다고 가정합니다. 항상 그런 것은 아닙니다. 프로그램을 제어 할 수 있으면 그렇게 할 수 있습니다. 복잡한 경우에는 명령을 실행하고 그에 따라 메일을 보내는 일종의 래퍼를 작성해야합니다. 그리고 랩퍼를 cron
작업 으로 넣으십시오 .
moreutils 의 chronic
명령은 명령이 실패하지 않으면 자동으로 명령을 실행합니다.
매뉴얼에서 인용 :
chronic은 명령을 실행하고 명령이 실패한 경우 (0이 아닌 종료 또는 충돌)에만 표준 출력 및 표준 오류가 표시되도록 정렬합니다. 명령이 성공하면 외부 출력이 숨겨집니다.
만성의 일반적인 용도는 크론 작업을 실행하는 것입니다. 명령을 조용히 유지하려고 시도하고 성공할 때 우연한 출력이 포함 된 메일을 처리하고 실패 할 경우 충분한 출력을 상세하게 표시하지 않고 항상 상세하게 실행하고 만성적 인 방식으로 성공적인 출력을 숨길 수 있습니다.
오류가있는 경우 어떻게 cron으로부터 이메일을받을 수 있습니까?
호출 된 프로세스의 리턴 코드가 0이 아니거나 추적 오류가 아닌 경우 cron 출력을 먹는 쉘 스크립트 인 cronic으로 cron 호출을 랩핑 할 수 있습니다 .
Cronic을 사용하려면 스크립트를 적절한 위치 (예 :)로 다운로드하십시오 /usr/local/bin
. 귀하의 crontab 항목은 스크립트 (예를 들어 경로로 시작되어야합니다 /usr/local/bin/cronic
단순히), 또는 cronic
귀하가 제공, PATH
적절하게 설정되어 있습니다.
"오류"는 질문에 잘못 정의 된 용어이며 신중하게 정의해야합니다. Cronic을 유용하게 사용하려면 오류 조건을 정의하는 방법 중 하나로 Cronic 보고서 오류로 랩핑 한 작업을 확인해야합니다. 텍스트 문자열을 작성하는 등의 암시적인보고 방법은 STDOUT
이를 크론 또는 다른 크론보고 메커니즘과 호환되도록 추가로 고려해야합니다.
크론 사이트에서 링크 된 다른 래퍼도 사용할 수 있습니다.
cronic
와 관련된 chronic
, 또는 단지 우연의 일치인가?
캡처 출력을하고 그것을 밖으로 인쇄 - 여기가 성공적으로 여러 해 동안 활용 한 또 다른 변형 만 에러가 . 임시 파일이 필요하지 않으며 모든 출력을 유지합니다 . 중요한 부분은 2>&1
STDERR을 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"
.
나는 이것을 완전히 생각하지는 않았지만
* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null
일반적인 경우 모든 파일을 임시 파일로 리디렉션 mktemp
하고 (고유 한 파일 이름을 얻는 데 사용하고 싶을 수 있음 ) 파일이 성공한 경우 파일을 삭제 한 다음 파일이 cat
여전히 존재하는 경우 해당 내용을 다시 삭제 합니다 (예 : yourthing.sh가 종료 됨) cron 메일러가 픽업해야합니다.
메모리가 제공되면 출력이 없으면 cron이 이미 아무것도 보내지 않으므로 로그 파일이 비어 있거나 존재하지 않으면 아무 일도 일어나지 않습니다. 오류 메시지를 리디렉션합니다.