通过使用 inotifywait,只能监控新文件。
我会询问“新文件”的定义。 man inotifywait 指定了一个事件列表,其中还列出了诸如create 和delete 和delete_self 之类的事件,并且 inotifywait 还可以监视“旧文件”(被定义为在 inotifywait 执行之前存在的文件)和目录。您只指定了一个事件 -e modify,它通知 ${path} 中文件的修改,它包括对两个预先存在的文件的修改,并在 inotify 执行后创建。
...如何确保脚本能够捕获所有文件?
您的脚本足以捕捉路径内发生的所有事件。如果您无法在生成文件的部分和接收文件的部分之间进行同步,那么您将无能为力,并且总是会出现竞争条件。如果您的脚本收到 0% 的 CPU 时间,而生成文件的部分将获得 100% 的 CPU 时间怎么办?不能保证进程之间的 cpu 时间(除非使用经过认证的实时系统......)。在它们之间实现同步。
您可以观看其他活动。如果生成站点在准备好文件时关闭文件,请注意关闭事件。您也可以在后台并行运行work on/with NEWFILE 以加快执行和读取新文件的速度。但是如果接收端比发送端慢,如果你的脚本在 NEWFILEs 上运行的速度比生成新文件的速度慢,你就无能为力了......
如果文件名中没有特殊字符和空格,我会选择:
inotifywait -m -e modify "${path}" |
while IFS=' ' read -r path event file ;do
lock "${path}"
work on "${path}/${file}"
ex. mv "${path}/${file}" ${new_location}
unlock "${path}"
done
其中lock 和unlock 是在您的脚本和生成部分之间实现的一些锁定机制。您可以在文件创建进程和文件处理进程之间创建通信。
我认为您可以使用一些事务文件系统,它可以让您从其他脚本“锁定”一个目录,直到您准备好对其进行工作,但我在该领域没有经验。
我尝试将这两个循环结合起来。但是,如果文件快速到达并且数量很大,那么文件将在第二个循环运行时到达的变化。
在运行 process_old_files_loop 之前在后台运行 process_new_file_loop。在继续处理现有文件循环之前,最好确保(即同步)inotifywait 已成功启动,这样它们之间也不会出现竞争条件。
也许一个简单的例子和/或起点是:
work() {
local file="$1"
some work "$file"
mv "$file" "$predefiend_path"
}
process_new_files_loop() {
# let's work on modified files in parallel, so that it is faster
trap 'wait' INT
inotifywait -m -e modify "${path}" |
while IFS=' ' read -r path event file ;do
work "${path}/${file}" &
done
}
process_old_files_loop() {
# maybe we should parse in parallel here too?
# maybe export -f work; find "${path} -type f | xargs -P0 -n1 -- bash -c 'work $1' -- ?
find "${path}" -type f |
while IFS= read -r file; do
work "${file}"
done
}
process_new_files_loop &
child=$!
sleep 1
if ! ps -p "$child" >/dev/null 2>&1; then
echo "ERROR running processing-new-file-loop" >&2
exit 1
fi
process_old_files_loop
wait # wait for process_new_file_loop
如果您真的关心执行速度并希望更快地完成,请更改为 python 或 C(或除 shell 之外的任何内容)。 bash 并不快,它是一个 shell,应该用于互连两个进程(将一个的 stdout 传递给另一个的 stdin)并逐行解析流while IFS= read -r line 在 bash 中非常慢,通常应该用作最后采取。也许使用xargs 像xargs -P0 -n1 sh -c "work on $1; mv $1 $path" -- 或parallel 这样可以加快速度,但普通的python 或C 程序可能会快n 倍。