전체 디렉토리 (새 디렉토리도 포함)에서 파일 (일부 꼬리 -f)을 모니터하십시오.


53

나는 보통 디렉토리에서 많은 로그를 봅니다 tail -f directory/*. 문제는 그 후에 새 로그가 생성되고 화면에 표시되지 않는다는 것입니다 ( *이미 확장 되었기 때문에 ).

프로세스가 시작된 후 작성된 파일을 포함하여 디렉토리의 모든 파일을 모니터링하는 방법이 있습니까?

답변:


44

당신은 할 수 꼬리 멀티 와 함께 ... PLE 파일을 multitail .

multitail -Q 1 'directory/*'

-Q 1 PATTERN1 초마다 PATTERN과 일치하는 기존 또는 새 파일에서 새 내용을 확인하는 것을 의미합니다 . 모든 파일의 줄은 같은 창에 표시되며 별도의 창 -q대신에 사용하십시오 -Q.


10

xtail또한 대안입니다. 해당 매뉴얼 페이지에서는 다음과 같이 설명합니다.

Xtail은 하나 이상의 파일을 모니터하고 명령 호출 이후 파일에 기록 된 모든 데이터를 표시합니다. 여러 로그 파일을 동시에 모니터링하는 데 매우 유용합니다. 명령 행에 제공된 항목이 디렉토리 인 경우 xtail 호출 후 작성된 파일을 포함하여 해당 디렉토리의 모든 파일이 모니터됩니다. 명령 행에 제공된 항목이 존재하지 않으면 xtail은 해당 항목을 감시하고 작성된 후이를 모니터합니다. 디스플레이에서 파일을 전환 할 때 파일의 경로 이름을 표시하는 배너가 인쇄됩니다.

인터럽트 문자 (일반적으로 CTRL / C 또는 DEL)는 가장 최근에보고있는 파일 목록을 표시합니다. 종료 신호 (보통 CTRL / 백 슬래시)를 보내 xtail을 중지하십시오.


1
링크가 끊어졌지만 다음과 같습니다 : manpages.ubuntu.com/manpages/zesty/man1/xtail.1.html
— edpaez

7

어떤 쉘 솔루션에 대해 생각하지 않지만 (리눅스 가정 1) inotify... 이동하는 방법이 될 수 모방이 예제를 참조tail -F (사용 pyinotify어쩌면이의 기초로 사용할 수 있습니다) 전체 디렉토리를 다음 .

일반적으로 inotify디렉토리를 모니터링 할 수 있습니다 (인용 man 7 inotify)

inotify_add_watch (2)를 호출 할 때 마스크에 다음 비트를 지정할 수 있으며 read (2)가 반환 한 마스크 필드에 반환 될 수 있습니다.

IN_ACCESS         File was accessed (read) (*).
IN_ATTRIB         Metadata changed, e.g., permissions, timestamps,
                    extended attributes, link count (since Linux 2.6.25),
                    UID, GID, etc. (*).
IN_CLOSE_WRITE    File opened for writing was closed (*).
IN_CLOSE_NOWRITE  File not opened for writing was closed (*).
IN_CREATE         File/directory created in watched directory (*).
IN_DELETE         File/directory deleted from watched directory (*).
IN_DELETE_SELF    Watched file/directory was itself deleted.
IN_MODIFY         File was modified (*).
IN_MOVE_SELF      Watched file/directory was itself moved.
IN_MOVED_FROM     File moved out of watched directory (*).
IN_MOVED_TO       File moved into watched directory (*).
IN_OPEN           File was opened (*).

디렉토리를 모니터링 할 때 위의 별표 (*)로 표시된 이벤트는 디렉토리의 파일에 대해 발생할 수 있으며,이 경우 리턴 된 inotify_event 구조의 이름 필드는 디렉토리 내의 파일 이름을 식별합니다.

(...이 pyinotify옵션을 밀접하게 따릅니다)

1BSD는 비슷한 것을 가지고 있습니다 kqueue. 어쩌면 크로스 플랫폼 솔루션은 달성 GIO (사용 파이썬 바인딩을 가, 옆에 수 있기 때문에 추상 계층) inotify, 또한 사용kqueue


2

나는 필요를 충족시키는 빠른 것을 썼다.

#!/bin/bash
LOG_PATTERN=$1
BASE_DIR=$(dirname $LOG_PATTERN* | head -1)

run_thread (){
    echo Running thread
    tail -F $LOG_PATTERN* &
    THREAD_PID=$!
}

# When someone decides to stop the script - killall children
cleanup () {
    pgrep -P $$ | xargs -i kill {}
    exit
}

trap cleanup SIGHUP SIGINT SIGTERM

if [ $# -ne 1 ]; then
    echo "usage: $0 <directory/pattern without * in the end>"
    exit 1
fi

# Wait for the directory to be created
if [ ! -d $BASE_DIR ] ; then
    echo DIR $BASE_DIR does not exist, waiting for it...
    while [ ! -d $BASE_DIR ] ; do
        sleep 2
    done
    echo DIR $BASE_DIR is now online
fi

# count current number of files
OLD_NUM_OF_FILES=$(ls -l $LOG_PATTERN* 2>/dev/null | wc -l)

# Start Tailing
run_thread

while [ 1 ]; do
    # If files are added - retail
    NUM_FILES=$(ls -l $LOG_PATTERN* 2>/dev/null | wc -l)
    if [ $NUM_FILES -ne $OLD_NUM_OF_FILES ]; then
        OLD_NUM_OF_FILES=$NUM_FILES
        kill $THREAD_PID
        run_thread
    fi
    sleep 1
done

1
실제로, 당신은 메인 루프에서 sleep 1을 생략 할 수 있으며, 새로운 파일을 얻는 것이 더 빠를 것입니다. 그러나 나는 그런 종류의 바쁜 대기를 좋아하지 않습니다
— Itamar

이 때문에 sleep이것은 바쁜 대기가 아니라 CPU에서 부드럽습니다. 하나는 그것을 바꿀 수 sleep 0.2s필요한 경우 빨리를 만들기 위해 (GNU 수면) 또는 무엇 이건.
— Ned64

2

또한 당신은 디렉토리를 볼 수 있습니다 watch

watch -n0,1 "ls -lrt /directory/ | tail"

작은 nitpick : 명령 watch의 첫 x 행 출력으로 대체 버퍼에서 화면을 다시 그 립니다. 변경 사항이없는 여러 파일에서 이전 파일이 변경되지 않으면 tail매번 동일한 내용이 렌더링 될 수 있으므로 이후 파일에서 아래쪽 파일 '아래'에 그려 지므로 추가 항목이 나타나지 않습니다. 화면. 짧은 파일의 경우, 이것은 괜찮습니다 ...
— jimbobmcgee

이것은 원래 문제에 대한 해결책을 제공하지 않습니다. 이것은 디렉토리 watch에있는 모든 파일의 최신 줄 (새 파일 포함) 대신 디렉토리 목록 (마지막으로 항상-덕분에 )을 출력합니다 (마지막 몇 줄) .
— trs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.