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

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

1)我很困惑,因为在那里是一个竞争条件,但Linux的使用它

2)是有更好的方法,以从外壳锁定文件?

3)或我必须使用目录代替?

实测溶液:人锁文件

有帮助吗?

解决方案

是,的确在示例脚本的竞争条件。你可以使用bash的noclobber选项,以获得一个故障在比赛中,当不同的脚本测试和触摸之间溜进来的情况。

它描述此处。我已经摘录临界片,与一对夫妇注释(由BK前缀:):

  

一个可能的解决方案,这是使用IO重定向和bash的noclobber选项模式,这将不会重定向到现有文件。我们可以使用类似于:

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

   # critical-section BK: (the protected bit)

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

其他提示

尝试群命令:

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的

锁定脚本(针对并行运行)

http://wiki.bash-hackers.org/howto/mutex

FYI。

好像我已经找到了一个简单的解决方案:人锁文件

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top