나는 보통 디렉토리에서 많은 로그를 봅니다 tail -f directory/*
. 문제는 그 후에 새 로그가 생성되고 화면에 표시되지 않는다는 것입니다 ( *
이미 확장 되었기 때문에 ).
프로세스가 시작된 후 작성된 파일을 포함하여 디렉토리의 모든 파일을 모니터링하는 방법이 있습니까?
답변
당신은 할 수 꼬리 멀티 와 함께 … PLE 파일을 multitail .
multitail -Q 1 'directory/*'
-Q 1 PATTERN
1 초마다 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
옵션을 밀접하게 따릅니다)
1
BSD는 비슷한 것을 가지고 있습니다 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"