私は通常、ディレクトリ内の多くのログをチェックしてこれを行います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