web-dev-qa-db-ja.com

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

私は通常、tail -f directory/*。問題は、その後新しいログが作成され、画面に表示されないことです(*は既に展開されています)。

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

56
santiagozky

tailmulti複数のファイルで… multitail

multitail -Q 1 'directory/*'

-Q 1 PATTERNは、1秒ごとに[〜#〜] pattern [〜#〜]に一致する既存または新しいファイルの新しいコンテンツをチェックすることを意味します。すべてのファイルの行が同じウィンドウに表示されます。個別のウィンドウを表示するには、-qではなく-Qを使用してください。

xtail も代替手段です。そのマニュアルページはそれを次のように説明しています:

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

割り込み文字(通常はCTRL/CまたはDEL)は、監視されている最後に変更されたファイルのリストを表示します。終了信号(通常はCTRL /バックスラッシュ)を送信して、xtailを停止します。

11
pika

シェルソリューションについてはわかりませんが、(Linuxを想定1inotify が最適な方法です... tail -Fpyinotify を使用)、おそらくディレクトリ全体を追跡するの基礎として使用できます

一般に、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( Python bindings )を抽象化レイヤーとして使用して実現可能です。これは、inotifyのほかに、 kqueue も使用できるためです。

8
sr_

私は必要を満たす簡単なものを書きました。

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

また、watchでディレクトリを監視できます

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