bash 聚集一个输出文件

bash flock an output file

如果多个进程可能正在写入同一个输出文件,聚集输出文件本身而不是单独的锁定文件是否安全?

例如这样安全吗?

outputFile=output.dat
exec 200>>"$outputFile"
flock -e 200
grep -i error "" >> "$outputFile"
flock -u 200

我发现的所有 flock 示例都使用单独的锁文件。

例如

outputFile=output.dat
lockFile=/var/tmp/output.dat
exec 200>"$lockFile"
flock -e 200
grep -i error "" >> "$outputFile"
flock -u 200

是的,在给定的特定(狭窄)使用模式下,您提出的建议是安全的。

您可以安全地使用单个文件执行的操作

  • 打开文件仅用于追加,但尚未持有锁。
  • 截断文件仅在持有锁后
  • 在持有锁的同时修改文件以不改变目录条目引用哪个 inode 的方式

只能用两个单独的文件做的事情

  • 最初用O_TRUNC打开锁文件。
  • 在持有锁的情况下,使用创建并重命名模式以原子方式修改数据文件。
  • 完全删除数据文件,与 rm 一样——确保任何新创建的版本获得不同的索引节点——同时持有锁。