bash 在跟踪日志时循环文件

bash 在跟踪日志时循环文件

我正在运行一个处理特定目录中文件的守护进程。我想将它们一一处理。所以想法是我将在守护进程目录中逐个复制文件,并跟踪其日志,当日志文件首先完成处理时,第二个文件应复制到守护进程目录,即日志文件停止更新。

我怎样才能做到这一点?说

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 1except一样。通常每秒也会检查文件中的新输入(尽管在 Linux 上,某些实现使用 inotify 来检测传入输入))。zselecttail -f

上面,我们使用mm-1( modified less than 1 minute ago) glob 限定符来检测守护进程何时完成对文件的处理。

如果在 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

相关内容