【问题标题】:Linux : How to check a file copy has finished in my watch folder?Linux:如何检查我的监视文件夹中的文件复制是否完成?
【发布时间】:2017-01-17 11:35:37
【问题描述】:

我有一个文件夹,不同的用户可以在其中放置他们的文档,例如 pdf、tif 等。 如果有任何新文件,我每分钟都会检查该文件夹,如果有,则选择该文件进行处理。

但是,我不想选择这个文件,以防它仍在被复制。 在这种情况下,我会在未来的周期中选择它。

但我面临的问题是。 那我如何检查我的文件夹中的文件复制是否已经完成?

我已经尝试了以下方法。 1) 尝试使用 C 程序以写入模式打开文件。 但是即使它仍在被复制,我也可以在写入模式下打开它。

2) 使用 lsof 命令检查是否有某个进程与此关联。 但是这个命令在非 root 用户的情况下不会给出结果。

注意:我可能是 Linux 上的非 root 用户。

【问题讨论】:

  • 您能否说明哪一部分是用 C、Java 和 shell 脚本完成的?

标签: java c linux shell


【解决方案1】:

您可以使用内核的inotify 工具来监听 IN_CLOSE_WRITE 事件。 复制完成后,程序关闭文件句柄,进而触发此事件。

IN_CLOSE_WRITE (+)
为写入而打开的文件已关闭。

有几个示例如何从 shell 中使用它,例如 here

使用 C 的示例here

【讨论】:

  • 这不会告诉你为什么文件被关闭了。例如,通过 FTP 上传文件并且连接丢失。如果您需要确切地知道 整个 文件已被复制,则需要使用某种方法来传达该信息 - 例如在复制完成后重命名文件。
【解决方案2】:

在大多数情况下,如果文件已经有一段时间没有被修改,假设复制已经完成就足够了。仅处理最近 15 分钟未修改的文件:

find . -mmin +15

正确的解决方案将要求所有程序都遵守某种锁定:

https://linux.die.net/man/2/flock

【讨论】:

  • 15 分钟太长了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2019-01-24
  • 2013-09-11
相关资源
最近更新 更多