在Bash中锁定文件
我很难找到一个在bash中锁定文件的好概念 基本上,我希望实现以下目标:在Bash中锁定文件,bash,io,locking,flock,Bash,Io,Locking,Flock,我很难找到一个在bash中锁定文件的好概念 基本上,我希望实现以下目标: 锁定文件 读取文件中的数据(多次) 处理数据 将新内容写入文件(不一定要写到最后) 解锁该文件 对我来说,使用flock执行此操作似乎是不可能的,因为文件描述符只会移动一次到文件末尾 创建临时文件也会失败,因为我可能会覆盖已经读取的行,这也是不可能的 编辑: 还要注意,我不控制的其他脚本可能会尝试写入该文件 因此,我的问题是如何在步骤1中创建一个锁,使其跨越步骤2、3、4,直到在步骤5中再次解锁为止?您可以使用flock实
还要注意,我不控制的其他脚本可能会尝试写入该文件 因此,我的问题是如何在步骤1中创建一个锁,使其跨越步骤2、3、4,直到在步骤5中再次解锁为止?您可以使用
flock
实用程序执行此操作。只需获得flock
即可使用单独的只读文件描述符,即打开文件两次。例如,要使用中间临时文件对文件进行排序:
(
flock -x -w 10 100 || exit 1
tmp=$(mktemp)
sort <"$file" >"$tmp"
cat "$tmp" > "$file"
rm -f "$tmp"
) 100<"$file"
(
flock-x-w 10 100 | |出口1
tmp=$(mktemp)
排序“$tmp”
cat“$tmp”>“$file”
rm-f“$tmp”
)100给定一个文件
,您可以在步骤1中创建一个临时文件。在步骤5中锁定
。在步骤2-4中,检查file.lock
是否存在。嗯,也许我需要编辑一下这个问题!我不能确定是否有其他工具(不是我的脚本)正在访问它!如果文件在那里,并且“另一个工具”具有读/写它的有效权限,则无法避免在脚本中发生这种情况。您可以考虑更改文件的权限,如果可以的话,或者将文件重新命名/MV到一个安全的地方并对其进行操作,在完成所有的操作之后,将文件重新命名为原来的名称/位置。@肯特,我知道我不能阻止程序,因为锁不是强制性的。但我还是想锁定那个文件。虽然移动可能会起作用,但可能会有一些不必要的副作用,比如如果脚本停止或计算机关闭,就会丢失该文件。斯汀昨天已经在查看flock,但它没有起作用。无论如何,改变你的解决方案效果很好!