헤드리스 서버(Ubuntu 14.04)의 cron에서 일반적으로 매일 실행되는 다양한 백업 스타일 스크립트가 있습니다. Cron에는 작업에 대한 피드백을 받을 수 있도록 메일 서버가 구성되어 있습니다. 일반적으로 이러한 백업 스크립트는 stdout/stderr 출력 없이 성공적으로 실행되도록 작성되어("뉴스가 없는 것은 좋은 소식이다"라는 표준 Unix 패러다임을 따름) 많은 정크 메일로 이메일 받은 편지함이 막히지 않도록 합니다.
때로는 이것이 실패하고 stdout/stderr 출력이 포함된 이메일을 즉시 받습니다. 그러나 이러한 실패는 종종알려진 원인, 특히 수명이 짧습니다(즉, 다음날 다시 사라질 수 있음). 예를 들어, 내 인터넷 연결이 약간 불안정하고 때로는 원격 DNS 확인이 실패합니다(이 문제의 목적에 따라 이 문제를 해결할 수 없다고 가정). 물론 이를 미리 예측할 수는 없으므로 동작 주파수를 줄이는 것은 불가능하다.
특정 작업이 초과하는 경우에만 cron이 실패하도록 하고 싶습니다.N시도하거나 잠시 후에 해결해야 하는 "영구적인" 오류에 대한 보고만 받게 됩니다. 그게 가능합니까?
저는 Ubuntu 14.04에서 cron 3.0pl1-124ubuntu2를 사용하고 있습니다. 비록 저는 다른 cron 유사 소프트웨어에 개방적이지만 보다 일반적인 답변(예: 스크립트 주위에 래퍼를 넣을 수 있음)이 다른 사람들에게 매우 유용할 것입니다. 확신하는.
내가 고려한 옵션:
- 이를 처리하기 위해 스크립트 자체에 논리를 통합하는 것은 하나의 옵션이지만 좀 더 일반적인 것을 찾고 있었습니다. 일부 스크립트는 bash이고 일부는 Python 등입니다. 또한 스크립트의 모든 stdout/stderr이 실제로 래퍼 함수에 있어야 하기 때문에 상황이 상당히 복잡해집니다.
- 지속적인 통합 서버를 사용하세요.젠킨스내 작업 실행을 처리합니다. 더 강력하고 내가 찾고 있는 종류의 플러그인을 제공할 수 있지만 관리하기가 훨씬 더 복잡하고 약간 무겁고(JVM 필요) Unix-y는 아닙니다.
- 이유없이- 원격 백업 등을 재시도하므로 리소스를 소비하고 예상치 못한 DoS를 일으킬 수 있으므로 다소 공격적입니다. 원래 계획대로 cron 작업을 다시 시도하고 싶습니다.
답변1
여러 날에 걸쳐 오류를 추적하려고 하기 때문에 기본적으로 문제를 기록해야 하지만 이러한 "로그"는 사용자와 관련될 필요가 없으며 cronjob에 대해서만 숨겨질 수 있습니다. 스크립트를 래핑하는 것이 올바른 선택인 것 같습니다.
maxAttempts=5
if [ -f ~/.script_fails ];then #determine the number of failures
failures=$(cat ~/.script_fails)
else
failures=0
fi
if [ $failures -lt $maxAttempts ];then #determine if failures exceeds max attempts
./script.sh > /dev/null #if so, get rid of output
else
./script.sh #otherwise keep it
fi
result=$?
if [ $result -eq 0 ];then #increment or remove counter
rm ~/.script_fails
else
failures=$failures + 1
echo $failures > ~/.script_fails
fi
이는 로깅을 유지하거나 무시해야 하는 시기를 결정하며 매우 간단합니다. 실패 횟수를 추적하는 데 사용되는 파일은 홈 디렉터리에 숨겨져 있으므로 원할 경우 확인할 수 있지만, 실패 횟수가 너무 높지 않으면 메일에는 아무 것도 표시되지 않습니다.
그러나 Jenkins를 사용하는 것이 좋습니다. 일단 구성되면 작업이 훨씬 쉬워집니다.
답변2
나는 이제 내 자신의 문제를 해결하기 위해 래퍼 유틸리티를 작성하기 시작했습니다.크로머. 이제 기본 형태로 실행됩니다. 모든 기여/풀 요청/문제 등을 환영합니다.