shell - inotifywait 在将 docx 转换为 PDF 时触发事件两次

标签 shell inotify inotifywait

我有一个带有 inotifwait 的 shell 脚本,设置如下:

inotifywait -r  -e close_write,moved_to  -m "<path>/upload" --format '%f##@@##%e##@@##%w'

有一些 docx 文件驻留在监视目录中,一些脚本通过以下命令将 docx 转换为 PDF:
soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir  <path>/upload/

以某种方式在生成 PDF 后立即触发两次事件。条目如下:
somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/
somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/

这里还有什么问题?

问候

最佳答案

它被触发两次,因为这就是 soffice 内部的行为方式。
有一天它可能会开始写 10 遍然后做 sleep 2在单次运行期间的此类写入之间,我们的程序不能,我认为不应该预测它并依赖它。

所以我会尝试从不同的角度解决问题 - 让我们将转换后的文件放入一个临时目录,然后将其移动到目标目录,如下所示:
soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir <path>/tempdir/ && mv <path>/tempdir/somedoc.pdf <path>/upload/
并使用 inotifywait通过以下方式:

inotifywait -r -e moved_to  -m "<path>/upload" --format '%f##@@##%e##@@##%w'

好处是你不再依赖soffice的内部逻辑。
如果您无法调整生成 pdf 文件的脚本的行为,那么您确实需要求助于@Tarun 建议的解决方法。

关于shell - inotifywait 在将 docx 转换为 PDF 时触发事件两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46482381/

相关文章:

linux - Linux 中 USB 设备的文件系统有任何更改时如何获得通知或如何递归使用 inotify

linux - Bash 监控目录并将文件移出到新位置

git - inotify:除了 .gitignore 中的文件外,还可以观察文件变化吗?

linux - 如何使用 AWK 或 SED 为文件中的每一行生成 UUID?

当我调用脚本并让脚本保持运行时,C++ 应用程序在退出时挂起

shell - Oozie 电子邮件操作截断包含换行符的字符串

python - 使用 asyncio.Queue 将数据从子流程安全地传递到异步任务

Node.js 语法错误 : Unexpected end of input

c - 如何打印 C 目录中新创建的文件的名称?

bash - 在后台运行 inotifywait