私は通常、tail -f directory/*
。問題は、その後新しいログが作成され、画面に表示されないことです(*
は既に展開されています)。
プロセスの開始後に作成されたファイルを含め、ディレクトリ内のすべてのファイルを監視する方法はありますか?
tailmulti複数のファイルで… multitail 。
multitail -Q 1 'directory/*'
-Q 1 PATTERN
は、1秒ごとに[〜#〜] pattern [〜#〜]に一致する既存または新しいファイルの新しいコンテンツをチェックすることを意味します。すべてのファイルの行が同じウィンドウに表示されます。個別のウィンドウを表示するには、-q
ではなく-Q
を使用してください。
xtail
も代替手段です。そのマニュアルページはそれを次のように説明しています:
Xtailは1つ以上のファイルを監視し、コマンドの呼び出し以降にファイルに書き込まれたすべてのデータを表示します。複数のログファイルを同時に監視するのに非常に役立ちます。コマンドラインで指定されたエントリがディレクトリの場合、xtailの呼び出し後に作成されたファイルを含め、そのディレクトリ内のすべてのファイルが監視されます。コマンドラインで指定されたエントリが存在しない場合、xtailはそれを監視し、作成されると監視します。画面でファイルを切り替えると、ファイルのパス名を示すバナーが印刷されます。
割り込み文字(通常はCTRL/CまたはDEL)は、監視されている最後に変更されたファイルのリストを表示します。終了信号(通常はCTRL /バックスラッシュ)を送信して、xtailを停止します。
シェルソリューションについてはわかりませんが、(Linuxを想定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( Python bindings )を抽象化レイヤーとして使用して実現可能です。これは、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
また、watch
でディレクトリを監視できます
watch -n0,1 "ls -lrt /directory/ | tail"