크론 작업에 확장된 로깅을 사용할 수 있나요?

크론 작업에 확장된 로깅을 사용할 수 있나요?

아래에 3개의 스크립트가 있습니다 /etc/cron.daily. 내 cron 로그는 /var/log/cron. 아래는 실행된 위의 크론에 대한 항목입니다.

(root) CMD (run-parts /etc/cron.hourly)

여기서는 cron 내부의 스크립트 stdout또는 중 하나를 사용할 수 없습니다. 이는 이 폴더에서 명령이 실행되었음을 보여줍니다.stderrrun-parts

3개의 스크립트가 실행되는 동안 발생한 일을 기록하는 데 도움이 되는 트릭이 있습니까?

cron.daily참고: 출력 및 오류를 로그 파일로 리디렉션하기 위해 스크립트를 편집할 수 없습니다 .

답변1

Unix에서 메일 시스템은 시스템 알림이 사용자에게 전달되는 수단입니다. Windows에서 무언가를 알려야 할 경우 팝업 메시지와 함께 작업 표시줄에 무언가가 표시되는 것과 비슷하다고 생각할 수 있습니다. 이론적으로 cronjob은 어떤 출력도 생성해서는 안 되기 때문에(아무도 그것을 볼 수 없기 때문에) 모든 출력(stdout 또는 stderr)은 오류나 문제를 나타낼 수 있는 것처럼 처리되어 이메일이 다음으로 전송됩니다. cronjob의 소유자에게 이를 확인하라는 메시지를 표시합니다.

따라서 모든 출력(stdout 및 stderr)은 로컬 메일 시스템을 통해 cronjob 소유자에게 전송됩니다. 소유자가 개인 계정이 아닌 경우 별칭을 설정하여 로컬 MTA가 실제 이메일 계정으로 릴레이하도록 지시할 수 있습니다. 예를 들어 다음을 추가했습니다 /etc/aliases.

root: [email protected]

그런 다음 명령을 실행했습니다 newaliases(메일 별칭 데이터베이스를 다시 작성하기 위해). 그 후, 저는 회사 이메일의 받은 편지함에 루트의 이메일을 받기 시작했습니다.

root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only

그 모든 영광을 보아라

이것이 다소 일반적인 방법입니다(시스템이 알림 이메일을 보내도록 허용). 통지를 처리하는 다른 방법이 있습니다. 몇 가지 대안:

이메일을 특정 파일에 저장하기 위해 별칭 수정:

root: /var/log/rootMails

메일을 스크립트로 파이핑:

root: |/usr/local/bin/filterMail

별칭을 조작하는 대신 MAILTO=많은 cron 데몬이 지원하는 사용자의 crontab 내부 옵션을 사용하는 것입니다. 사용자 알림의 특정 세트만 받고 사서함에 들어오는 알림은 받지 않으려면 이 방법이 더 바람직할 수 있습니다 aliases.

다른 것들도 많이 있을 거라고 확신하지만 아마도 첫 번째나 마지막 것을 하고 싶을 것입니다.

답변2

-s메일을 보내는 대신 syslog를 사용하는 옵션 으로 cron을 실행할 수 있습니다 . 이는 적어도 RHEL 및 그 파생 제품인 FreeBSD 및 MacOS에서 작동합니다.

답변3

Bash 스크립트 내에서 직접 로깅을 수행할 수 있습니다.

logfile=/var/log/mine/whatever.log

log () {
    timestamp=$(date +'%F %T')
    echo -e "$timestamp $1" >> $logfile
    shift
    for a; do
        echo -ne "$a" >> $logfile
    done
}    

log "Hello world.\nAnd so on..."

[...]

기록하려는 출력이 있는 명령을 실행하는 경우:

somecommand 2>&1 >> $logfile

또한 메시지와 오류를 시스템 로거(참조)로 보내고 man logger잠재적으로 syslog 구성을 통해 정렬할 수도 있습니다.

관련 정보