2011-07-26 5 views
18

특정 크기에 도달 한 후 동일한 이름으로 다시 작성되는 로그 파일을 테일링하는 스크립트를 만드는 솔루션이 필요합니다.꼬리를 사용하여 자주 다시 작성되는 로그 파일을 보려면 어떻게해야합니까?

"tail -f"를 사용하면 파일을 다시 만들거나 회전 할 때 꼬리말이 멈 춥니 다.

내가하고 싶은데요 파일 꼬리와 예를 들어 100 라인에 도달 후 스크립트를 작성하고 명령을 다시 시작하십시오 ... 아니면 파일을 다시 만들 때 명령을 다시 시작하는 것이 좋습니다? 이게 가능한거야?

감사합니다.

답변

2

watch "tail -f" yourfile.log 
+0

시계를 사용할 수 없습니다. 불행히도 – gfunk

15

예를 실행 해보십시오! (다만 실패가 아닌 파일이 존재하거나 액세스 할 수 없습니다하지 않는 경우 꼬리 재 시도를 할 것 재시도 - 잠재적으로 변경중인 파일)이 사용

tail -f --retry <filename> 

또는

tail --follow=name --retry 

당신은 모든 기능을 지원하고 시계를 가지고 있겠지 때문에 꼬리를 실행하는 루프 무기한 간단한 스크립트를 사용할 수있는 꼬리를 가지고 있겠지 때문에 또는

tail -F <filename> 
+0

이 작업은 좋아 보이지만 오류가 발생합니다. – gfunk

+0

~> tail -f --follow = name --retry /logs/logs/log.log 꼬리 : 입력을 열 수 없습니다. – gfunk

+0

거기에'/ logs'가 두 번있는 것처럼 보입니다. 그게 의도적 인거야? 해당 파일이 없거나 사용 권한이없는 경우 오류가 발생합니다. 그러나,'--retry'를 사용하면 파일이 존재하거나 권한이있을 때까지 계속 시도 할 것입니다. 먼저 현재 디렉토리에있는 테스트 파일로 시험해보십시오. – evan

0

.

#!/bin/bash 

PID=`mktemp` 
while true; 
do 
    [ -e "$1" ] && IO=`stat -c %i "$1"` 
    [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; } 

    # as long as the file exists and the inode number did not change 
    while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]] 
    do 
    sleep 0.5 
    done 
    [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID 
    sleep 0.5 
done 2> /dev/null 
rm -rf $PID 

이 스크립트를 완전히 종료하려면 트랩을 사용하는 것이 좋습니다. 이것은 당신에게 달려 있습니다.

기본적으로이 스크립트는 tail 명령을 죽이기 위해 inode 번호 (stat -c %i "$1" 사용)가 변경되었는지 확인하고 파일을 다시 만들 때 새 번호를 시작합니다.

참고 : 출력을 오염시킬 echo "restarting tail"을 제거 할 수 있습니다. 그것은 테스트에만 유용했습니다. 또한 inode 번호를 확인한 후 tail 프로세스를 시작하기 전에 파일을 교체하면 문제가 발생할 수 있습니다.

2

꼬리 -F가 하지 사용할 수 있으며, 당신이 logrotate에에서 복구하려는 경우, 당신은 파일을 당신의 logrotate.d/ 사양 파일에 copytruncate 옵션을 추가 그래서 대신에 새 파일을 회전 한 후 각각의 시간을 만들 수 있습니다 복사본이 회전되어있는 동안 유지되고 잘립니다.

이렇게하면 이전 파일 핸들은 새 로그가 추가되는 새 (truncated) 로그 파일을 계속 가리 킵니다.

copy-truncate 프로세스 중에 데이터가 손실 될 수 있습니다.

관련 문제