附加到文件时如何避免竞争条件?

时间:2015-10-02 07:03:25

标签: linux file shell append race-condition

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

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

是否有一种简单,惯用的避免竞争条件的方法?我可以将数据传输到单文件服务器吗?

编辑:

实际上,竞争条件正是我想要的。但每一行必须是原子的,所以没有任何一行被破坏。但是,行可以是交错的。

2 个答案:

答案 0 :(得分:1)

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

sem --id atomicwrite echo hi >> file

因此,要测试它,请在不同的终端中运行这些:

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

答案 1 :(得分:0)

您可以使用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