【问题标题】:How do I avoid race conditions when appending to a file?附加到文件时如何避免竞争条件?
【发布时间】:2015-10-02 07:03:24
【问题描述】:

我正在考虑使用 PipelineDB 进行分析。对于数据仓库,我想将所有新数据附加到一个文件中,并将 tail -F 它添加到 psql 中,就像网站上的示例一样。

我有多个数据源,因此为了获得确定的结果,我想将它们全部附加到同一个输入文件中,它们将保持相同的顺序。

有没有一种简单、惯用的方法来避免竞争条件?我可以将数据传输到单文件服务器之类的东西吗?

编辑:

实际上,比赛条件正是我想要的。但是每一行都必须是原子的,所以没有一行是被破坏的。不过,行可能是交错的。

【问题讨论】:

    标签: linux file shell append race-condition


    【解决方案1】:

    您可以使用 mkdir 来模拟互斥锁,它是原子创建和检查操作(这是在内核级别确保的):

    # locking example -- CORRECT
    # Bourne
    lockdir=/tmp/myscript.lock
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        echo >&2 "successfully acquired lock: $lockdir"
        # continue script
    else
        echo >&2 "cannot acquire lock, giving up on $lockdir"
        exit 0
    fi
    

    有关更多信息(和其他解决方案),请查看常见问题解答:

    http://mywiki.wooledge.org/BashFAQ/045

    【讨论】:

    • 最好我希望我的脚本同时运行。
    • 那么另一种选择是使用命名管道进行同步。
    【解决方案2】:

    您可以使用 GNU Parallel 像这样使用互斥锁预先/包装所有写入:

    sem --id atomicwrite echo hi >> file
    

    因此,要对其进行测试,请在单独的终端中运行它们中的每一个:

    for i in {0..999}; do sem --id atomicwrite echo hi >> file ; done
    

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2010-09-25
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多