전체 디렉토리 (새 디렉토리도 포함)에서 파일 (일부 꼬리 -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.