我通常会在目录中查看许多日志来执行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