在shell脚本中,我想等待某个文件出现
inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do
# Call other programs which process the file like stat or sha1sum
done
我会假设文件在处理代码中有效。可悲的是,文件似乎消失了,例如由sha1sum
处理后。
我是否遗漏了一些显而易见的东西,这对于使文件持续存在是必要的?
答案 0 :(得分:1)
许多进程创建临时文件并快速删除它们。这就是进步的本质。
要防止在循环执行时删除文件,请使用 hard 链接:
inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do
ln "$FILE" tmpfile$$ || continue
sha1sum tmpfile$$
rm tmpfile$$
done
如果文件在while循环开始之前被销毁,那么你无能为力。但是,如果它存在于循环的开头,则只要您需要,使用硬链接将确保它继续存在。
硬链接不会阻止其他进程更改文件。如果这是一个问题,那么副本(cp
)是必要的。
为此,临时文件必须与原始文件系统位于同一文件系统上。
如果此应用程序对安全性敏感,您可能需要使用mktemp
或其他此类实用程序来生成临时文件的名称。