ディレクトリ全体(新しいディレクトリを含む)のファイル監視(tail -f)

ディレクトリ全体(新しいディレクトリを含む)のファイル監視(tail -f)

私は通常、ディレクトリ内の多くのログをチェックしてこれを行いますtail -f directory/*。問題は、新しいログが作成され、画面に表示されないことです(*すでに拡張されているため)。

プロセスの開始後に生成されたファイルまで、ディレクトリ内のすべてのファイルを監視する方法はありますか?

答え1

あなたはできます たくさん複数のファイルと...マルチテール

multitail -Q 1 'directory/*'

-Q 1 PATTERN既存のファイルまたは新しいファイルに一致する新しいコンテンツがあることを確認することを示します。模様1秒ごとに。ファイル内のすべての行は、別のウィンドウでは-qなく同じウィンドウに表示されます-Q

答え2

xtailまた、代替。マニュアルページでは、次のように説明します。

Xtailは1つ以上のファイルを監視し、コマンドが呼び出された後にファイルに書き込まれたすべてのデータを表示します。複数のログファイルを同時に監視するのに便利です。コマンドラインで指定されたエントリがディレクトリの場合、xtailが呼び出された後に生成されたファイルを含むそのディレクトリ内のすべてのファイルが監視されます。コマンドラインに提供されたエントリが存在しない場合、xtailはそのエントリを監視し、生成された後に監視します。ディスプレイでファイルを切り替えると、ファイルパス名を示すバナーが印刷されます。

区切り文字 (通常 CTRL/C または DEL) は、モニター中の最近変更されたファイルのリストを表示します。 xtailを停止するには、終了信号(通常はCTRL /バックスラッシュ)を送信します。

答え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

関連情報