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
一样——确保任何新创建的版本获得不同的索引节点——同时持有锁。
如果多个进程可能正在写入同一个输出文件,聚集输出文件本身而不是单独的锁定文件是否安全?
例如这样安全吗?
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
一样——确保任何新创建的版本获得不同的索引节点——同时持有锁。