是否可以在 Linux 中锁定一个文件,以便当另一个进程打开该文件进行写入时,该文件无法被读取?

是否可以在 Linux 中锁定一个文件,以便当另一个进程打开该文件进行写入时,该文件无法被读取?

我们都知道 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并不阻止人们尝试,当然我自己也做过。为了进一步学习这个问题,我建议一次像样的讨论

如果我的警告仍然不合适(没有回答提问者的问题),我建议不要删除它,而是让问题评论部分下值得信赖的人复制它。当然是在验证之后。谢谢。

相关内容