当前位置:  开发笔记 > 编程语言 > 正文

普通锁定文件中的竞争条件?

如何解决《普通锁定文件中的竞争条件?》经验,为你挑选了2个好方法。

这是使用文件系统创建锁的标准方法.例如,visudo使用它:

[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock

1)我很困惑,因为有竞争条件,但Linux使用它

2)有没有更好的方法来锁定shell中的文件?

3)或者我必须使用目录吗?

找到解决方案:man lockfile.



1> Barry Kelly..:

是的,示例脚本确实存在竞争条件.你可以使用bash的noclobber选项,以便在比赛时,当一个不同的脚本在测试和触摸之间潜入时失败.

它在这里描述.我已经摘录了关键部分,带有几个注释(以BK为前缀:):

一个可能的解决方案是使用IO重定向和bash的noclobber模式,它不会重定向到现有文件.我们可以使用类似的东西:

if (set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; 
then
   # This will cause the lock-file to be deleted in case of a
   # premature exit.
   trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT

   # Critical Section: Here you'd place the code/commands you want
   # to be protected (i.e., not run in multiple processes at once).

   rm -f "$lockfile"
   trap - INT TERM EXIT
else
   echo "Failed to acquire lock-file: $lockfile." 
   echo "Held by process $(cat $lockfile)."
fi



2> jpastuszek..:

尝试flock命令:

exec 200>"$LOCK_FILE"
flock -e -n 200 || exit 1

如果锁定文件被锁定,它将退出.它是原子的,它可以在最新版本的NFS上运行.

我做了一个测试.我创建了一个0的计数器文件,并在两个服务器上同时循环执行以下500次:

#!/bin/bash

exec 200>/nfs/mount/testlock
flock -e 200

NO=`cat /nfs/mount/counter`
echo "$NO"
let NO=NO+1
echo "$NO" > /nfs/mount/counter

一个节点正在与另一个节点争夺锁定.当两个运行完成后,文件内容为1000.我已经尝试了多次,它总是有效!

注意:NFS客户端是RHEL 5.2,使用的服务器是NetApp.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有