在linux中需要命令来判断,如果这个文件正在被写入它。
我们已经使用脚本来备份数据,并且工作正常。 现在我需要一个聪明的方法来复制备份文件(比如file.csv以复制到另一个位置)。 所以我需要一个命令来确保文件(file.csv)是否完成了写入,只需要写入,我需要将其复制到另一个位置。
感谢您的帮助提前。 如果这是混乱,我可以详细说明。
你想要的是Incron:
http://inotify.aiken.cz/?section=incron&page=about&lang=en
Incron可以侦听特定的文件系统事件并执行匹配事件的操作。
您可以使用lsof或fuser的状态来确定文件是否打开。
就像是:
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有一些限制:
只有至less有以下一种情况是正确的:
否则,当进程通过closures句柄而失去locking并守护它的父进程( flock进程)也会死亡,最终释放该锁。
这对于长时间运行的进程并不是很有用。 由于进程没有意识到locking,所以在运行时不能释放该锁。 所以即使进程没有写入文件,锁也被持续保持
另一个终极的,更复杂的,但更强大的解决scheme是实现以上所有内部文件写入代码。 这将使您只能在规定期限内获得locking,在写入交易完成后立即释放。 查看有关鸡群的特定于语言的手册。
你可能想知道的几件事:
您可能还想看看使用fcntl进行强制locking,但是在当前的linux内核中已知它是不可靠的