답변:
crontab에서 MAILTO가 스크립트를 실행하는 메일 별명을 가리 키도록 설정할 수 있습니다. 이 스크립트는 메일 메시지를 수락하고 헤더 및 기타 goop을 제거하고 나머지를 로거로 기록합니다. 모든 cron 스크립트 출력은 MAILTO에 지정된 주소로 전송되므로 모든 것을 캡처합니다.
예 : crontab에서
MAILTO=myalias
/ etc / mail / aliases에서 (sendmail을 사용한다고 가정)
myalias:"|/usr/local/bin/my-processing-script.sh"
스크립트가 메일 헤더를 제거하고 cron 출력을 처리하도록합니다.
명령에 의해 생성 된 모든 출력은 crontab (5) 파일에 설정된대로 또는 MAILTO 변수가 설정되지 않은 경우 (또는 at (1) 또는 batch (1) 작업 인 경우) MAILTO 환경 변수에 지정된 사용자에게 전송됩니다. ), 작업 소유자에게. 명령이 출력을 생성하지 않거나 MAILTO 환경 변수가 빈 문자열로 설정된 경우 메일이 전송되지 않습니다.
로컬 메일을 사용하기 때문에 실제로 설정하지 않아도되거나 mailx가 아직 설치되어 있지 않으면 설치하지 않아도됩니다. Cron이 출력을 보내면 파일에 메일을 저장하고 거기서 많은 일을 할 수 있습니다. cron이 사용자의 요구에 직접 맞게 작동하는 방식을 수정하려고 시도하는 것은 좋은 방법이 아닙니다. 그렇게 생각하지 않으면 cron을 패치하고 다시 빌드하기 만하면 my_cron이라고하고 cron 대신 사용하십시오. 그리고 my_cron을 최신 상태로 유지하고 자주 재 구축 할 준비를하십시오.
모든 스크립트의 시작 부분에 이것을 추가하여 모든 것을 기록하고 첫 번째 오류에서 멈춤
exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
> /var/log/YOUR_LOG_FILE 2>&1
즉, 먼저 stdout을 파일로 리디렉션 한 다음 stderr 만 stdout (현재 파일을 가리킴)으로 리디렉션합니다.
/programming//a/7145618/20774에있는 Ryan Ye의 스크립트 는 stdout과 stderr을 모두 수행하지만 유용합니다.
이 작업을 수행하는 작은 스크립트 cronlog.sh가 있습니다. 스크립트 코드
#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"
그럼 넌 할 수있어
cronlog.sh /opt/scripts/sql_fetch >> your_log_file
결과 예
cronlog.sh echo 'hello world!'
[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo