在Bash中锁定文件

时间:2014-03-19 13:08:30

标签: bash io locking flock

我有一个问题,就是在bash中找到锁定文件的好概念,

基本上我想实现以下目标:

  1. 锁定文件
  2. 读入文件中的数据(多次)
  3. 处理数据。
  4. 将新内容写入文件(不一定到最后)
  5. 解锁该文件
  6. 使用flock执行此操作似乎不可能,因为文件描述符只会移动一次到文件的末尾。

    同样创建Tempfile失败,因为我可能会覆盖已读取的行,这也是不可能的。

    编辑:
    另请注意,我无法控制的其他脚本可能会尝试写入该文件。

    所以我的问题是如何在步骤1中创建一个锁,这样它将跨越2,3,4步直到我在步骤5中再次解锁?

1 个答案:

答案 0 :(得分:2)

可以使用flock实用程序执行此操作。您只需要flock使用单独的只读文件描述符,即打开文件两次。例如。使用中间临时文件对文件进行排序:

(
    flock -x -w 10 100 || exit 1

    tmp=$(mktemp)

    sort <"$file" >"$tmp"

    cat "$tmp" > "$file"

    rm -f "$tmp"
) 100<"$file"

flock将为您的文件发出flock()系统调用,如果已被锁定则会阻止。如果超过超时,则脚本将中止并显示错误代码。