【问题标题】:How best to implement atomic update on a file inside a bash script [duplicate]如何最好地在 bash 脚本中的文件上实现原子更新[重复]
【发布时间】:2020-01-21 17:54:53
【问题描述】:

我有一个脚本,它具有多个功能,并行运行,它检查文件并经常更新它。我不希望两个函数同时更新文件并创建问题。那么进行原子更新的最佳方式是什么。到目前为止,我有以下内容。

counter(){
    a=$1
    while true;do
        if [ ! -e /tmp/counter.lock ];then
            touch /tmp/counter.lock
            curr_count=`cat /tmp/count.txt`
            n_count=`echo "${curr_count}  + $a" | bc`
            echo ${n_count} > /tmp/count.txt
            rm -fv /tmp/counter.lock
            break
        fi
        sleep 1 
    done
}

我不确定如何将我的函数转换为使用flock,因为它使用文件描述符,如果我多次调用此函数(或者我认为是这样)可能会产生问题。

【问题讨论】:

  • 这是flock最基本的用例。您是否尝试过围绕羊群搜索现有答案?

标签: linux bash sh flock


【解决方案1】:

flock 的工作原理是让任何人打开锁定文件,但如果其他人先锁定它,则阻止它。在您的代码中,第二个进程可以在您看到锁不存在但在您实际创建它之前测试它是否存在。

counter () {
  a=$1
  {
     flock -s 200
     read current_count < /tmp/count.xt
     ...
     echo new_count > /tmp/count.txt
  } 200> /tmp/counter.lock
}

这里,两个进程可以打开/tmp/counter.lock进行写入。在一个进程中,flock 将获得锁并立即退出。另一方面,flock 将阻塞直到第一个进程通过在命令块完成后关闭其文件描述符来释放锁。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2020-08-21
    • 2015-01-29
    • 1970-01-01
    • 2017-01-24
    • 2016-12-05
    • 1970-01-01
    • 2017-07-11
    • 2021-11-23
    相关资源
    最近更新 更多