2012-04-05 2 views
-1

나는 3 일에 한 번 maillog를 정리하고 정렬 할 cron 작업을 사용하고 싶다.왜 sed로 몇 줄을 지우고 나면, Postfix는 maillog를 쓸 수 없다.

/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 

작업이 잘 작동하고 3 단계처럼

내 작업 같습니다 보내 "상태 ="

  • 정렬을 포함하지 않는 모든 라인 maillog에서 삭제

    1. 을 반송 , 다른 로그에서 deffered.
    2. 은 maillog에서 내 maillog가 완전히 깨끗하고 3 로그에 정렬이 작업 한 후 "상태"

    를 포함하는 모든 행을 삭제합니다.

    하지만 Postfix는 다음 레코드를 maillog에 쓰고 싶지 않습니다.

    sed 명령을 삭제하고 Postfix가 다음 레코드를 정상적으로 기록합니다.

    sed 명령이 실행 cron 작업 후 maillog를 차단하는 이유는 무엇입니까?

  • +0

    필자는 왜 그렇게 긴 파이프 라인을 사용하는지 알지 못합니다. '-i'를 가지고 있기 때문에 처음부터 연결된 각 섹션에서 '/ var/log/maillog'를 처리하고 있는데 출력이 나오지 않을 것입니다, 맞습니까? 그래서 왜 모든 연결 관은? (')'wrapper를 필요로하지 않고, 생성 된 출력물이 파일로 들어가기 때문에 연결 파이프가 필요 없다고 생각합니다. 그리고 첫 번째 단계는 중복되며, 중간 단계는 3 단계, 트랩은 개별 상태 = STR을 설정합니다. 그러나 나는 단지 일어나고 있고, 조금 흐려서 어쩌면 나는 뭔가를 놓치고있다. – shellter

    +0

    제가 알기에, 하나가 아닌 3 개의 작업을하는 것이 더 영리하게 될 것입니다. – Jason

    +0

    디자인에 핵심 요소 (이유)가 누락되었을 수 있지만, 특히 긴 용도로 사용할 수없는 여러 가지 추가 하위 프로세스를 생성 할 때 하나의 긴 이유가 있음을 알 수 없습니다. 모든 여분의 하위 프로세스를 갖는 것은 당신이 스스로 나쁜 습관을 짓는 것을 제외하고는 별 문제가되지 않습니다.당신이 정말로 큰 시스템을 서비스하려고하는 시점에 이르면 시간이 핵심입니다. 그렇다면 시스템 자원을 쓰는 것입니다 (정당한 이유가없는 추가 하위 프로세스). 최소한의 솔루션이 무엇인지 이해하고 실제로 필요한 기능을 추가하는 것이 가장 좋습니다. – shellter

    답변

    1

    sed -i은 수정 파일을 해제되므로, 시스템 로그/접미사는 존재하지 않는 파일에 쓰는 것입니다. http://en.wikipedia.org/wiki/Sed에서

    :

    참고 : "SED -i는"원래

    로그를 처리하는 것이 더 일반적이다

    있었다 수있는 링크를 깨고, 새로운 원본 파일을 덮어 씁니다 logrotate 또는 savelog과 같은 도구를 사용하여 파일을 제 위치에서 회전시킨 후 syslog가 중단없이 계속 기록 할 수 있습니다.

    /var/log/maillog을 수정해야하는 경우 cron 작업이 끝나면 syslog를 다시로드 할 줄을 추가 할 수 있습니다. 이렇게하면 은 스크립트가 실행되는 동안 로그 라인이 파일에 쓰여지는 것을 막을 수 있습니다. 이 명령은 실행중인 배포/운영 체제에 따라 다릅니다. rsyslog를 사용하는 우분투에서는 reload rsyslog >/dev/null 2>&1입니다.

    +0

    네, logrotate가 좋은 아이디어 인 것 같습니다. – Jason

    0

    나는 당신은 매우 가능성이 같은 파일이 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가 파일을 옮길 때와 똑같은 초 단위로 로그 파일에 쓰는 경우 레코드의 전부 또는 일부를 잃을 수도 있습니다. 그러나 당신의 솔루션은 비슷한 문제를 안고 더 많은 기회를 가질 수 있습니다.

    중첩 된 (....) | (....) 하위 프로세스를 사용하여 디자인 의도를 오해 한 경우, 미안합니다! 게시물을 업데이트하여 해당 기술 전문가를 사용하는 이유를 포함 시키십시오.

    이 정보가 도움이되기를 바랍니다.

    +0

    나는 mv/var/log/maillog /var/log/maillog.20120406.090745를 할 때 Postfix가 걱정하지 않는다는 것을 알았다. 다른 maillog 파일을 만들지는 않지만 maillog.20120406.090745에 계속 로그를 작성합니다. 나는 내가 별개의 직업을 갖고 당신의 시나리오를 무장하고 시간을 새롭게 바꾼다고 생각한다. 고마워, 셸터. – Jason

    +0

    (....) | (....) - 3 단계 모두를 하위 프로세스로 하나의 프로세스로 통합하고이 작업의 시간을 단축하는 데 도움이되었다고 확신했습니다. 그러나 지금 나는 그것이 내 생각에 틀렸을지도 모른다는 것을 안다. – Jason