ログの追跡中にbashループファイル

ログの追跡中にbashループファイル

特定のディレクトリのファイルを処理するデーモンを実行しています。私はそれらを一つずつ処理したい。したがって、アイデアは、デーモンディレクトリにファイルを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 1001秒間スリープします。組み込み除外と同じです。)sleep 1通常、毎秒ファイルに新しい入力があることを確認します(Linuxでは、一部の実装では着信入力を検出するためにinotifyを使用します)。zselecttail -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

関連情報