使用flock以bash方式读取和写入文件

时间:2015-11-18 20:36:05

标签: bash parallel-processing flock

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

这是我到目前为止所拥有的:

.item-custom-first select{
    width: inherit !important;
}
.item-custom-second div{
    display: inline-flex !important;
   width: auto !important;
}

这是从子shell运行的,所以我必须通过文件进行计数。

所以,两件事

  1. 这不是使用相同的锁来读写 - 我也是这样,但我不知道如何做到这一点
  2. 为什么我的读物有时会被忽略?
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

您不需要为读取和写入过程重用相同的描述符。在其他语言中,这将是一种代码气味,但是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移动到那里),你可以重复使用单个文件描述符进行读取和写入。

答案 1 :(得分:0)

我按照示例here。我不完全确定为什么切换到使用变量流描述符有帮助,但我完成了我所需要的。另一件不同的是,在示例中,他们使用锁定的子shell中的实际文件名,而不是实际引用流。

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