내 홈 서버는 정기적으로 여러 셸 스크립트를 실행하여 유지 관리 작업(주로 백업 및 기타 작업)을 수행합니다. 오류가 발생하면 알림을 받고 작업 시간도 기록하고 싶습니다.
현재 내 설정은 다음과 같습니다.
- Cron은 다른 스크립트를 호출하는 쉘 스크립트를 호출합니다(그래서 너무 복잡해지지 않습니다). 각 작업에 시간이 얼마나 걸릴지 모르고 서로 간섭하는 것을 원하지 않기 때문에 별도의 cron 프로젝트보다는 하나의 스크립트를 사용하여 여러 작업을 처리하기로 결정했습니다.
- 내 cron 설정에는 MAILTO 줄이 포함되어 있습니다. 나는 어떤 오류도 발생하지 않습니다.
- 로깅이 없습니다. 나는 가끔씩 백업이 실제로 존재하는지 확인합니다.
각 스크립트에서 파일(또는 syslog)에 대한 로깅을 구현할 수 있다는 것을 알고 있습니다. 각 스크립트에 개별적으로 코딩할 필요가 없도록 중앙 지점에서 정의할 수 있는 방법이 있습니까?
더 나은 모니터링을 달성하는 방법을 잘 모르겠습니다. 나는 로그 분석 시스템이 이에 대해 과잉이라고 생각합니다. 어떤 사람들은 shell/cron 대신 Jenkins를 통해 스크립트를 실행할 것을 제안했지만 이것이 더 힘든 것 같습니다.
간단하고 좋은 옵션은 무엇입니까?
답변1
나는 다음을 구현했습니다.
- 표준 출력으로 출력을 활성화하거나 개별 단계에 대한 사용자 정의 출력을 추가합니다. 예:
- echo "백업 시작..."
- rsync에 관계없이 && echo "백업 성공" ||
- 스크립트의 각 단계에서 반환 코드를 확인하고 아래 첨자를 즉시 종료하거나 계속하고 스크립트 끝에서 오류 코드를 반환합니다.
- 모든 출력을 로그 파일로 리디렉션하는 유지 관리 스크립트에 대한 래퍼를 작성했으며 유지 관리 스크립트에 오류가 있으면 이메일을 받습니다.
유지 관리 스크립트 예(단일 단계가 중단되더라도 종료되지 않지만 결국 오류를 반환함):
#!/bin/bash
RETURNCODE=0
echo "Execution started $(date)"
/root/do_something.sh || RETURNCODE=1
# (...)
exit $RETURNCODE
이제 내 crontab에 있는 다른 스크립트를 호출하는 래퍼 스크립트의 예:
#!/bin/bash
# exit on any error (there should not be any in this script)
set -e
LOGFILE="/var/log/my.log"
# redirect STDOUT and STDERR to logfile...
if /root/maintenance.sh > $LOGFILE 2>&1; then
# the colon ":" means: do nothing
:
else
# on error, send me an email
mail -s "maintenance script failed" [email protected] < "$LOGFILE"
fi