我们都知道,Linux/Unix 会自动阻止尝试写入当前打开以供另一个进程写入的文件。但是,如果另一个进程打开文件进行写入,是否可以阻止/锁定对文件的读取访问?我有两个不同的脚本,它们都在随机时间启动并在一天中的不同时间运行:一个脚本覆盖特定文件;另一个从该文件中读取。如果第一个打开文件,我希望第二个阻止(等待)或失败。
我们都知道,Linux/Unix 会自动阻止尝试写入当前打开以供另一个进程写入的文件。但是,如果另一个进程打开文件进行写入,是否可以阻止/锁定对文件的读取访问?我有两个不同的脚本,它们都在随机时间启动并在一天中的不同时间运行:一个脚本覆盖特定文件;另一个从该文件中读取。如果第一个打开文件,我希望第二个阻止(等待)或失败。
flock(1)实用程序可以做你想做的事
当你想覆盖文件时,取出文件的写锁
flock -x /path/to/lockfile 某个命令文件
让另一个命令检查锁。
flock -n /path/to/lockfile 另一个命令文件
如果文件被锁定,那么你会得到一个退出代码 1 否则它是你的,你可以用它做你想做的事
由于您已经完全不同步运行..您可以做一些简单的事情,即让“写入”过程创建一个临时名称为 .tmp 的新文件,因此如果它将创建的文件是 output1.txt 它可以工作输出 1.txt.tmp。
一旦编写器完成,它所做的最后一件事就是一个 mv 命令。
从这里你可以做两件事。读者不关心,因为由于 tmp 文件是不同的 inode,mv 不会伤害它(Linux 将保持它活着,只要它有一个消费者)并且下一次读取将有新文件..
(只要最后一次使用旧文件运行不会对您造成伤害)。
另一种选择是阅读器查找 tmp 文件并在该文件存在时阻止(这成为一种锁定文件)。
没有资格(还:-))对问题发表评论让我通过“回答”警告读者该问题的虚假陈述:
我的证明基于
man 2 open,write
此并不会阻止我尝试自己所做的尝试。为了进一步了解这个问题,我建议进行体面的讨论。如果我的警告仍然不合适(不回答提问者的问题)而不是删除它,我建议在问题评论部分由可信的人复制它。当然是经过验证。谢谢你。