crontab의 모든 stderr 출력을 파일에 로깅 stderrcrontab에 모든 스크립트 를 기록하고

예를 들어 다음과 stderr같은 방법으로 하나의 스크립트를 기록 할 수 있습니다 .

* * * * * run_script.sh > /var/log.txt 2>&1

그러나 stderrcrontab에 모든 스크립트 를 기록하고 싶습니다 . > /var/log.txt 2>&1모든 스크립트에 추가 할 수 있지만에 수백 개의 스크립트가 있으면 좋지 않습니다 cron. 이 작업을 수행하는 또 다른 더 간단한 방법이 있습니까?



답변

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


답변

/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


답변