전체 디렉토리 (새 디렉토리도 포함)에서 파일 (일부 꼬리 -f)을 모니터하십시오. 나는 보통 디렉토리에서 많은 로그를 봅니다 tail

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

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



답변

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

multitail -Q 1 'directory/*'

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


답변

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

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

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


답변

어떤 쉘 솔루션에 대해 생각하지 않지만 (리눅스 가정 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


답변

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

#!/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


답변

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

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


답변