답변:
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
sleep
이것은 바쁜 대기가 아니라 CPU에서 부드럽습니다. 하나는 그것을 바꿀 수 sleep 0.2s
필요한 경우 빨리를 만들기 위해 (GNU 수면) 또는 무엇 이건.
또한 당신은 디렉토리를 볼 수 있습니다 watch
watch -n0,1 "ls -lrt /directory/ | tail"
watch
의 첫 x 행 출력으로 대체 버퍼에서 화면을 다시 그 립니다. 변경 사항이없는 여러 파일에서 이전 파일이 변경되지 않으면 tail
매번 동일한 내용이 렌더링 될 수 있으므로 이후 파일에서 아래쪽 파일 '아래'에 그려 지므로 추가 항목이 나타나지 않습니다. 화면. 짧은 파일의 경우, 이것은 괜찮습니다 ...
watch
에있는 모든 파일의 최신 줄 (새 파일 포함) 대신 디렉토리 목록 (마지막으로 항상-덕분에 )을 출력합니다 (마지막 몇 줄) .