确定文件是否正在写入-Linux中

linux中需要命令来判断,如果这个文件正在被写入它。

我们已经使用脚本来备份数据,并且工作正常。 现在我需要一个聪明的方法来复制备份文件(比如file.csv以复制到另一个位置)。 所以我需要一个命令来确保文件(file.csv)是否完成了写入,只需要写入,我需要将其复制到另一个位置。

感谢您的帮助提前。 如果这是混乱,我可以详细说明。

你想要的是Incron:

http://inotify.aiken.cz/?section=incron&page=about&lang=en

Incron可以侦听特定的文件系统事件并执行匹配事件的操作。

您可以使用lsoffuser的状态来确定文件是否打开。

就像是:

lsof /path/to/csv.txt || backup_script.sh lsof /path/to/csv.txt || backup_script.sh
fuser /path/to/csv.txt || backup_script.sh 循环中的fuser /path/to/csv.txt || backup_script.sh将等同于: 仅当此文件未打开时才运行备份脚本。

你可能想要使用某种锁。

如果你控制作家(至less是他们开始的方式)考虑使用flock

最简单的方法是使用命令行工具flock

  • 使用flock --shared <file> <writing_command>运行writer(或者许多编写者)– flock --shared <file> <writing_command>在这里使用--shared来允许几个独立的进程获取locking非常重要。
  • flock --exclusive <file> <backup_script>运行备份脚本

当共享锁被其他进程占用时,这将阻止你的备份脚本启动。 与此同时,独占锁不能获得共享锁。 这将推迟作者的开始,直到该锁被释放

命令行解决scheme有一些限制:

  1. 只有至less有以下一种情况是正确的:

    • 进程(写入器或备份脚本)不会守护进程
    • 或者它不closures它的文件句柄

    否则,当进程通过closures句柄而失去locking并守护它的父进程( flock进程)也会死亡,最终释放该锁。

  2. 这对于长时间运行的进程并不是很有用。 由于进程没有意识到locking,所以在运行时不能释放该锁。 所以即使进程没有写入文件,锁也被持续保​​持

另一个终极的,更复杂的,但更强大的解决scheme是实现以上所有内部文件写入代码。 这将使您只能在规定期限内获得locking,在写入交易完成后立即释放。 查看有关鸡群的特定于语言的手册。

你可能想知道的几件事:

  • 锁被附加到文件句柄,所以closures文件将导致释放锁
  • 锁被inheritance,所以进程的所有subprocess都持有相同的锁
  • 锁的inheritance是句柄inheritance的结果。 这也意味着释放subprocess中的句柄的锁将会自动执行,并且不会阻止直接访问文件而不需要获取锁,所以这只有在每个涉及进程获得对父进程的适当的锁释放锁

您可能还想看看使用fcntl进行强制locking,但是在当前的linux内核中已知它是不可靠的