我正在运行一个处理特定目录中文件的守护进程。我想将它们一一处理。所以想法是我将在守护进程目录中逐个复制文件,并跟踪其日志,当日志文件首先完成处理时,第二个文件应复制到守护进程目录,即日志文件停止更新。
我怎样才能做到这一点?说
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
except一样。通常每秒也会检查文件中的新输入(尽管在 Linux 上,某些实现使用 inotify 来检测传入输入))。zselect
tail -f
上面,我们使用mm-1
( m
odified less than 1 m
inute 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