我们都知道 Linux/Unix 会自动阻止尝试写入当前由另一个进程打开的文件。但是是否可以阻止/锁定读访问如果另一个进程打开文件进行写入,我能否写入该文件?我有两个不同的脚本,它们都随机启动,并在一天中的不同时间运行:一个脚本覆盖特定文件;另一个脚本从该文件读取。如果第一个脚本打开了文件,我希望第二个脚本阻塞(等待)或失败。
答案1
这羊群(1)实用程序可能会做你想做的事
当你想覆盖文件时,请解除文件的写锁
flock -x /path/to/lockfile 一些命令文件
让其他命令检查锁。
flock -n /path/to/lockfile 另一个命令文件
如果文件被锁定,则退出代码为 1,否则文件就是你的,你可以用它做你想做的事
文件:
-x, -e, --exclusive 获得独占锁,有时也称为写锁。这是默认设置。
-n, --nb, --nonblock 如果无法立即获取锁,则失败(退出代码为 1)而不是等待。
答案2
由于您已经完全不同步运行..您可以做一些简单的事情,即让“写入”过程创建具有临时名称(例如 .tmp)的新文件,因此如果它将创建的文件是 output1.txt,它将在 output1.txt.tmp 中工作。
一旦写入器完成,它所做的最后一件事就是执行 mv 命令。
从这里你可以做两件事。一是让读取器不关心,因为由于 tmp 文件是不同的 inode,mv 不会损害它(只要它有消费者,Linux 就会让它保持活动状态),下一次读取将有新文件。
(只要最后一次运行旧文件不会对您造成伤害)。
另一种选择是,读取器查找临时文件并在该文件存在时阻止(这成为一种锁文件)。
答案3
由于还没有资格(暂时 :-))对问题进行评论,因此我通过“回答”的方式警告读者该问题的错误陈述:
我们都知道,linux/Unix 会自动阻止尝试写入当前由另一个进程打开的文件。
我的证明依据man 2 open,write
并不阻止人们尝试,当然我自己也做过。为了进一步学习这个问题,我建议一次像样的讨论。
如果我的警告仍然不合适(没有回答提问者的问题),我建议不要删除它,而是让问题评论部分下值得信赖的人复制它。当然是在验证之后。谢谢。