监视整个目录(甚至是新目录)中的文件(à la tail -f)

监视整个目录(甚至是新目录)中的文件(à la tail -f)

我通常会在目录中查看许多日志来执行tail -f directory/*.问题是,此后创建了一个新日志,它不会显示在屏幕上(因为*已经展开)。

有没有办法监视目录中的每个文件,甚至是进程启动后创建的文件?

答案1

你可以尾巴 ple 文件与...多尾

multitail -Q 1 'directory/*'

-Q 1 PATTERN表示检查现有文件或新文件中是否有新内容匹配图案每 1 秒。所有文件中的行都显示在同一窗口中,使用-q而不是-Q具有单独的窗口。

答案2

xtail也是一种替代方案。它的手册页将其描述为:

Xtail 监视一个或多个文件,并显示自命令调用以来写入文件的所有数据。它对于同时监视多个日志文件非常有用。如果命令行上给出的条目是目录,则将监视该目录中的所有文件,包括 xtail 调用后创建的文件。如果命令行上给出的条目不存在,xtail 将监视它并在创建后对其进行监控。在显示屏中切换文件时,会打印一条显示文件路径名的横幅。

中断字符(通常是 CTRL/C 或 DEL)将显示正在监视的最近修改的文件的列表。发送退出信号(通常是 CTRL/反斜杠)来停止 xtail。

答案3

您也可以使用以下方式观看目录watch

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

答案4

我写了一篇快速的文章来满足需要。

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

相关内容