特定のディレクトリのファイルを処理するデーモンを実行しています。私はそれらを一つずつ処理したい。したがって、アイデアは、デーモンディレクトリにファイルを1つずつコピーし、そのログを追跡することです。ログファイルが最初の処理を完了したら、2番目のファイルをデーモンディレクトリにコピーする必要があります。つまり、ログファイルの更新が停止します。
どうすればいいですか?説明する
daemon_dir=/var/daemon_dir/
daemon_log_file=/var/daemon/daemon_log
処理するファイルが5つあります(例:ファイル{1..5})
# ls -1
file1
file2
file3
file4
file5
したがって、私のループはそのまま進むべきです。
for file in file{1..5}
do
cp ${file} ${daemon_dir}
# daemon sees new file arriving in its dir, & starts processing
# log is tailed
tail -f ${daemon_log_file}
# when log file stops updating say for 1minute or specified time, tail quits
done
そしてループは次のファイルから始まります。
答え1
zsh
代わりにを使用すると、bash
次のことができます。
zmodload zsh/zselect
for file in file{1..5}; do
cp -- $file $daemon_dir || exit
touch -- $daemon_log_file
while
()(($#)) $daemon_log_file(Nmm-1)
do
zselect -t 100
done
done
(zselect -t 100
1秒間スリープします。組み込み除外と同じです。)sleep 1
通常、毎秒ファイルに新しい入力があることを確認します(Linuxでは、一部の実装では着信入力を検出するためにinotifyを使用します)。zselect
tail -f
上記では、デーモンがファイル処理を完了した時期を検出するためにmm-1
(1inutem
未満の前に修正された)glob修飾子を使用しました。m
Linuxを使用している場合は、IN_CLOSE_NOWRITE
デーモンが入力ファイルを一度だけ開き(それを開く唯一のデーモンである)、ファイルを処理するのに十分な時間が必要であると仮定して、ファイル内のinotifyイベントを監視できます。時計を設定する
for file in file{1..5}; do
cp -- "$file" "$daemon_dir" || exit
inotifywait -qqe close_nowrite -- "$daemon_dir/$file"
done
- ベースのアプローチでは、tail -f
次のことができます(zshを使用)。
zmodload zsh/system
tail -f -- $daemon_log_file |
for file in file{1..5}; do
cp -- $file $daemon_dir || exit
while sysread -t 60 -o 1; do
continue
done
done