需要 Linux 中的命令来确定文件是否正在写入其中。
我们已经使用脚本备份数据,并且运行良好。现在我需要一种智能方法来复制备份文件(例如 file.csv 复制到另一个位置)。所以我需要一个命令来确保文件(file.csv)是否已完成写入,仅在写入后,我需要将其复制到另一个位置。
提前感谢你的帮助。如果令人困惑,我可以详细说明。
答案1
你想要的是 Incron:
http://inotify.aiken.cz/?section=incron&page=about&lang=en
Incron 可以监听特定的文件系统事件并对匹配的事件执行操作。
答案2
lsof
您可以使用或的状态fuser
来确定文件是否打开。
就像是:
lsof /path/to/csv.txt || backup_script.sh
或者
fuser /path/to/csv.txt || backup_script.sh
在循环中相当于:仅当此文件未打开时才运行备份脚本。
答案3
您可能需要使用某种锁。
如果您控制编写器(至少是他们开始的方式)请考虑使用flock
。
最简单的方法是使用命令行工具flock
:
- 运行编写器(或多个编写器)在这里
flock --shared <file> <writing_command>
使用很重要--shared
,以允许几个独立的进程获取锁。 - 使用以下方法运行备份脚本
flock --exclusive <file> <backup_script>
这将阻止您的备份脚本在其他进程持有共享锁时启动。同时,当持有独占锁时无法获取共享锁。这将延迟写入器的启动,直到释放该锁
命令行解决方案有一些限制:
仅当以下至少一项为真时,它才会起作用:
- 进程(写入器或备份脚本)未进行守护进程
- 或者它没有关闭它的文件句柄
否则,当进程通过关闭句柄并守护进程而失去锁时,它的父进程(
flock
进程)也会死亡,最终释放该锁。对于长时间运行的进程来说,这没什么用。由于进程不知道锁定,因此它们在运行时无法释放该锁定。因此,即使进程没有写入文件,锁定也会持续被持有。
另一个终极、更复杂但更强大的解决方案是在文件写入代码中实现上述所有功能。这将允许您仅在所需的时间内获取锁定,并在写入事务完成后立即释放它。查看有关 flock 的特定语言手册。
您可能想知道以下几件事:
- 锁与文件句柄相关联,因此关闭文件将导致释放锁
- 锁是可继承的,因此进程的所有子进程都持有同一个锁
- 锁的继承是句柄继承的结果。这也意味着释放子进程中句柄的锁将 - 这些锁是自愿的,不会阻止在未获取锁的情况下直接访问文件,因此这只有在每个相关进程都获取适当的锁并释放父进程的锁时才会起作用
您可能还想了解强制锁定,fcntl
但据了解,它在当前的 Linux 内核中是不可靠的