나는 당신은 매우 가능성이 같은 파일이 sed -i
처리 모두에 로그 메시지를 잃을 수, 당신은
/bin/sed -i /status=/!d /var/log/maillog \
| (/bin/grep "status=bounced" /var/log/maillog \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u >> /root/unsent.log\
) \
| (/bin/grep "status=deferred" /var/log/maillog \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u >> /root/deferred.log\
) \
| (/bin/grep "status=sent" /var/log/maillog \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u >> /root/sent.log \
) \
| /bin/sed -i "/status=/d" /var/log/maillog
@alberge가 언급 한 바와 같이
을 추가 한 파이프 라인을 강조하기 위해 원래 코드를 포맷했습니다./여기에 가정은 후위, 그것은 (사용하는 '좋아한다'고 표준 이름으로 새 파일을 만드는 것입니다 (나는 날짜가 파일 이름에 maillog를 이동할 것
:
나는 다른 접근 방식을 제안한다 var/log/maillog).
그렇다면 진정한 목표는 별도의 이름을 가진 파일, 즉 unsent.log, deferred.log, sent.log에 다양한 범주의 메시지를 추출하는 것입니다. status=
문자열을 포함하지 마십시오 (먼저 그렇게 했음).
내 대체 메시지입니다 (전체 메시지를 읽으시 고 바로 복사/붙여 넣기/excute하지 마십시오!).
logDate=$(/bin/date +%Y%m%d.%H%M%S)
/bin/mv /var/log/maillog /var/log/maillog.${logDate}
/bin/grep "status=bounced" /var/log/maillog.${logDate} \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/unsent.log.${logDate}
/bin/grep "status=deferred" /var/log/maillog.${logDate} \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/deferred.log.${logDate}
/bin/grep "status=sent" \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/sent.log.${logDate}
이 코드가 작동하는지 테스트하려면 터미널 창에,
/var/log/maillog.${logDate}
이 제대로 복사되었는지 확인
/bin/cp /var/log/maillog /var/log/maillog.${logDate}
복사/붙여 넣기와 제 2 라인 (/bin/mv ....
)를 교체 한 후 복사/각 섹션을 한 번에 하나씩 붙여넣고 각각의 /root
로그 파일에 예상 출력이 만들어 졌는지 확인하십시오.
(이 블록 중 하나에 대한 오류 메시지가 표시되면 각 연속 줄에 마지막 '\'문자 다음에 공백/탭 문자가 없는지 확인하거나 각 3 개의 파이프 라인을 다시 폴드 할 수 있습니다. 한 줄에 '\'문자를 제거하십시오.
(각각 /root
로그 파일을 만들 때 하위 프로세스로 둘러싸인 파이프를 통해 연결 섹션을 사용하지 않지만, 고급 기술을 위해서는 이런 종류의 기술을 사용합니다. 따라서 기술을 버리거나, 정말로 필요할 때 사용하십시오 .-
이 모든 것이 필요에 따라 작동하는지 확인한 후 당신은 scrip을 확장한다. 나는 당신의 출력 파일의 각 ${logDate}
을 추가 한
/bin/rm /var/log/maillog.${logDate}
,하지만 난 당신이 sort -u >>
을 사용하고 참조로 당신은 당신의 하위 로그 파일에 그 '확장'을 제거 할 수 있습니다 t는 최종 청소를 수행하는 names (unsent.log, deferred.log, sent.log) 그리고 그 파일들을 자연스럽게 자라게하십시오. 두 경우 모두 어느 시점에서 다시 돌아와서이 데이터를 얼마나 오래 보관할 것인지를 결정해야하며 유용하지 않을 때 이러한 로그 파일을 정리하는 방법에 대한 계획과 방법을 개발해야합니다. 누군가 logrotate
패키지를 언급 한 것 같아요. 이를 장기적인 해결책으로 생각할 수도 있습니다.
이 솔루션은 별도의 프로세스가 많이 생성되는 피, 그리고 (대부분) 손실 된 로그 레코드의 가능성을 제거합니다. Postfix가 파일을 옮길 때와 똑같은 초 단위로 로그 파일에 쓰는 경우 레코드의 전부 또는 일부를 잃을 수도 있습니다. 그러나 당신의 솔루션은 비슷한 문제를 안고 더 많은 기회를 가질 수 있습니다.
중첩 된 (....) | (....)
하위 프로세스를 사용하여 디자인 의도를 오해 한 경우, 미안합니다! 게시물을 업데이트하여 해당 기술 전문가를 사용하는 이유를 포함 시키십시오.
이 정보가 도움이되기를 바랍니다.
필자는 왜 그렇게 긴 파이프 라인을 사용하는지 알지 못합니다. '-i'를 가지고 있기 때문에 처음부터 연결된 각 섹션에서 '/ var/log/maillog'를 처리하고 있는데 출력이 나오지 않을 것입니다, 맞습니까? 그래서 왜 모든 연결 관은? (')'wrapper를 필요로하지 않고, 생성 된 출력물이 파일로 들어가기 때문에 연결 파이프가 필요 없다고 생각합니다. 그리고 첫 번째 단계는 중복되며, 중간 단계는 3 단계, 트랩은 개별 상태 = STR을 설정합니다. 그러나 나는 단지 일어나고 있고, 조금 흐려서 어쩌면 나는 뭔가를 놓치고있다. – shellter
제가 알기에, 하나가 아닌 3 개의 작업을하는 것이 더 영리하게 될 것입니다. – Jason
디자인에 핵심 요소 (이유)가 누락되었을 수 있지만, 특히 긴 용도로 사용할 수없는 여러 가지 추가 하위 프로세스를 생성 할 때 하나의 긴 이유가 있음을 알 수 없습니다. 모든 여분의 하위 프로세스를 갖는 것은 당신이 스스로 나쁜 습관을 짓는 것을 제외하고는 별 문제가되지 않습니다.당신이 정말로 큰 시스템을 서비스하려고하는 시점에 이르면 시간이 핵심입니다. 그렇다면 시스템 자원을 쓰는 것입니다 (정당한 이유가없는 추가 하위 프로세스). 최소한의 솔루션이 무엇인지 이해하고 실제로 필요한 기능을 추가하는 것이 가장 좋습니다. – shellter