bash 스크립트를 사용하여 현재 날짜의 이름을 딴 여러 로그 파일을 모니터링하는 작업이 있습니다. YYYY-MM-DD.log.
(1) 파일을 팔로우했지만 tail -f
파일 회전을 처리할 수 없었습니다.
그럼에도 불구하고 tail -F $FILENAME
최대 24시간 동안만 로그를 추적할 수 있으며 재부팅이 필요합니다.
내가 성취하고 싶은 것은 비슷한 것을 만들어 tail -F $CURRENTDATE
영원히 실행하고 매 자정마다 현재 날짜의 이름을 딴 새 로그 파일을 따르도록 전환하는 것입니다.
그러나 변수는 $CURRENTDATE
동적이지 않은 것 같습니다. crontab
24시간마다 스크립트를 실행 하지 않고 이를 수행할 수 있는 다른 방법이 있습니까 ? 어쩌면 기호 파일이나 다른 것을 설정할까요?
(2) 동시에 tail -f
사용하는 경우 후속 파일이 손실되거나 이름이 바뀌면 어떤 신호를 반환합니까? 실행 중 예외를 잡는 방법.
답변1
이 변수는 $CURRENTDATE
생각만큼 역동적이지 않습니다. tail -F $CURRENTDATE
이 변수는 실행을 위해 명령을 평가할 때 확장됩니다. 이는 명령을 실행한 후 실행 해 보면 ps
알 수 있습니다 . 출력에는 가 아닌 현재 날짜의 값이 표시됩니다 $CURRENTDATE
.
$ CURRENTDATE=$(date +%Y%M%d.log)
$ tail -F $CURRENTDATE
$ ps -eaf|grep tail
saml 1171 13564 0 22:13 pts/4 00:00:00 tail -F 20130517.log
당신이 겪고 있는 문제는 일반적으로 대부분의 서버 데몬(예: Apache, Nginx 또는 Jetty)이 모든 현재 날짜를 이름이 지정된 파일에 기록한 다음 error.log
해당 파일을 다른 이름(예: error_20130517.log
나중에)으로 회전시키는 이유입니다.
error.log
이를 통해 와 같은 명령을 사용하여 지속적으로 모니터링할 수 있습니다 tail -F error.log
.
답변2
이것이 바로 당신이 찾고 있는 것입니다:
watch -n 60 'tail -n 30 /path/to/logfile-$(date +%Y-%m-%d.log)'
그러면 60초마다 현재 날짜의 로그 파일이 새로 고쳐집니다. n개의 매개변수를 원하는 대로 맞춤설정하세요. 작은따옴표에 유의하세요. 이렇게 하면 watch 명령이 명령을 한 번 평가하고 출력을 제공하는 대신 매번 명령을 평가하게 됩니다. 나 자신도 같은 문제가 있었고 이것은 나에게 완벽하게 작동했습니다. 다른 방식이 아닌 이 방식으로 로그하는 프로그램을 디버깅하려는 경우 현재 답변인 "큰 플레이어는 장난을 좋아하지 않으므로 logrotate를 사용합니다"가 적절한 솔루션이라고 생각합니다.
이것은 빠르고 더러운 접근 방식이지만 무언가를 개발하는 경우 큰 소년처럼 logrotate를 사용하십시오.