![크론 작업에 확장된 로깅을 사용할 수 있나요?](https://rvso.com/image/52111/%ED%81%AC%EB%A1%A0%20%EC%9E%91%EC%97%85%EC%97%90%20%ED%99%95%EC%9E%A5%EB%90%9C%20%EB%A1%9C%EA%B9%85%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
아래에 3개의 스크립트가 있습니다 /etc/cron.daily
. 내 cron 로그는 /var/log/cron
. 아래는 실행된 위의 크론에 대한 항목입니다.
(root) CMD (run-parts /etc/cron.hourly)
여기서는 cron 내부의 스크립트 stdout
또는 중 하나를 사용할 수 없습니다. 이는 이 폴더에서 명령이 실행되었음을 보여줍니다.stderr
run-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 구성을 통해 정렬할 수도 있습니다.