조언을 듣고자 글을 남깁니다 (bash shell)
글쓴이: incle / 작성시간: 화, 2020/05/12 - 10:45오전
안녕하세요 질문이 있어서 글 남깁니다
솔루션에서 syslog를 통해 여러 로그를 남기고 있는데요 여기서 제가 원하는 특징 키워드가 포함된 로그를 별도로 따로 빼고 싶습니다
그래서
cat aa/* | grep setting | grep korea >> /root/test/file
이런 명령어를 통해 'korea' 키워드가 들어간것만 /root/test/file로 빼고 있는데요
이 작업을 크론에 5분에 한번씩 동작하도록 등록 하였습니다
근데 제가 원하는것은 파일에 korea라는 키워드가 등록될때만 쌓이게 하고싶은데 5분마다똑같은 파일을 계속 덮어쓰다보니 내용도 너무 많고 다 중복이라 생각하는 데이터가 나오지 않고 있습니다.
bash로 개선할수있는 좋은 방안 없을까요?
tail 을 백그라운드로 계속 실행시켜서 로그안에 저 키워드가 들어갈때만 파일로 옮기고싶은데
조언 부탁드리겠습니다.
Forums:
cron 말고 백그라운로 실행시키세요
tail -f aa/* | grep setting | grep korea >> /root/test/file
------------------------------------------------------------
ProgrammingHolic
서버 운영 환경이 너무 다양하고 원하시는 내용이 아닐
서버 운영 환경이 너무 다양하고 원하시는 내용이 아닐 수도 있어서 예상 가능한 환경을 가정하고 말씀드립니다.
cat aa/*를 보니까 aa 디렉터리 안에 여러 로그파일이 존재하는 것으로 추정됩니다.
원하시는 내용이 '중복된 데이터의 배제'라면 >> (append)가 아닌 > (newfile)로 redirection을 정해주시면 될 듯 합니다.
질문 올리신 분이 cron으로 정해진 시간마다 돌아가도록 만드셨다는 것을 보아 aa 디렉터리 안에 있는 파일들의 내용을 전부 탐색하는 overhead에 대해서는 중요한 문제가 아닌 것으로 가정했습니다.
위 스크립트를 조금 손 보자면 다음과 같이 축약할 수 있습니다.
CentOS7 기준으로 설치된 grep의 -h 옵션은 여러 파일을 탐색 할 때 출력되는 파일이름의 정보를 생략하는 옵션입니다.
또한 grep으로 찾는 내용의 기준이 setting이라는 문자열과 korea라는 문자열이 모두 포함된 라인을 찾으시는 것 같은데,
만일 grep이 -E옵션을 통해 Extended Regular Expression을 지원하고 있고, setting이라는 문자열 뒤에 korea라는 문자열이 오는 경우 다음과 같이 RegExp를 사용할 수 있습니다.
RegExp 내용은 "setting 문자열 뒤에 . => 임의의 문자가 * => 연속적으로 나타나고, korea 라는 문자열이 존재할 때" 입니다.
굳이 tail을 쓰시고자 한다면 위 내용들을 조합하여 다음과 같은 스크립트 사용을 고려 해 보실 수 있습니다.
위 스크립트는 백그라운드로 실행되기 때문에 cron 실행이 필요치 않을 것으로 예상됩니다.
stdbuf의 사용은 standard output의 flush를 위한 방편입니다.
tail의 사용으로 장기간 오픈된 log파일이 삭제되거나 rotate되는 경우 file descriptor가 닫히고 script실행에 장애가 있을 수 있으니
이러한 예상 가능한 점도 충분히 숙지하시고 사용하시면 될 듯 합니다.
댓글 달기