使用 flock 读取和写入 bash 中的文件

Using flock to read and write to a file in bash

我有一个 bash 脚本,可能会 运行 多次并行,我需要能够检查文件中的值并修改它。理想情况下,我希望首先到达那里的脚本实例能够在不受另一个实例干扰的情况下进行读取和写入。我以为我可以用 flock 做到这一点,但似乎有些命令被忽略了——我猜是因为它们无法获得锁?

这是我目前的情况:

myfunc () {
    { flock -x 3 ; count=$(cat <&3); } 3< countfile
    { flock -x 3 ; echo $((count+1)) >&3; } 3> countfile
}

这是来自子 shell 的 运行,因此我必须通过文件进行计数。

所以,有两件事

  1. 这不是使用同一个锁来读取和写入--我喜欢这样,但我不知道该怎么做
  2. 为什么我的阅读有时会被忽略?

谢谢!

我遵循了这个例子here。我不完全确定为什么切换到使用可变流描述符有帮助,但我完成了我需要的。另一件不同的事情是,在示例中,他们使用的是锁定子外壳内的实际文件名,而不是实际引用流。

这对我来说是新东西,所以欢迎评论。

您不需要为读取和写入进程重复使用相同的描述符。在其他语言中,这可能是一种代码味道,但 bash 没有对在现有 FD 中查找的本机支持,因此这是一个不幸的问题。

myfunc () {
  {
    flock -x 3 || return
    count=$(<countfile)
    echo "$((count + 1 ))" >countfile
  } 3<>countfile
}

就是说——并非所有解决方案都是原生的! @telotortium has written an excellent C helper 可用于在预先打开的FD中寻找;如果您要使用他们的代码来查找文件的开头(或类似于将其截断为 0 并将 FD 移到那里的东西),您可以为读取和写入重用一个文件描述符。