在Bash中锁定文件

在Bash中锁定文件,bash,io,locking,flock,Bash,Io,Locking,Flock,我很难找到一个在bash中锁定文件的好概念 基本上,我希望实现以下目标: 锁定文件 读取文件中的数据(多次) 处理数据 将新内容写入文件(不一定要写到最后) 解锁该文件 对我来说,使用flock执行此操作似乎是不可能的,因为文件描述符只会移动一次到文件末尾 创建临时文件也会失败,因为我可能会覆盖已经读取的行,这也是不可能的 编辑: 还要注意,我不控制的其他脚本可能会尝试写入该文件 因此,我的问题是如何在步骤1中创建一个锁,使其跨越步骤2、3、4,直到在步骤5中再次解锁为止?您可以使用flock实

我很难找到一个在bash中锁定文件的好概念

基本上,我希望实现以下目标:

  • 锁定文件
  • 读取文件中的数据(多次)
  • 处理数据
  • 将新内容写入文件(不一定要写到最后)
  • 解锁该文件
  • 对我来说,使用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,但它没有起作用。无论如何,改变你的解决方案效果很好!