Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300939
  • 博文数量: 106
  • 博客积分: 1948
  • 博客等级: 上尉
  • 技术积分: 947
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 00:11
文章分类

全部博文(106)

文章存档

2014年(1)

2013年(14)

2012年(61)

2011年(30)

分类: LINUX

2011-05-23 15:20:35

flock命令在我的系统属于util-linux-2.13-0.46.fc6包,如果没有此命令,尝试更新您系统下的util-linux包。
介绍此命令的原因:
论坛中曾有woodie兄写的脚本串行化的讨论,已经很完善了。
但flock此命令既与shell脚本结合的很好,而且与C/PERL/PHP等语言的flock函数用法很相似,使用起来也很简单。相比之下,woodie兄那篇的内容需要不浅的shell功底来理解。
两种格式分别为:
       flock [-sxon] [-w timeout] lockfile [-c] command...

       flock [-sxun] [-w timeout] fd
介绍一下参数:
-s为共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。
-e为独占或排他锁,在定向为某文件的FD上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置共享锁或独占锁都会失败。只要未设置-s参数,此参数默认被设置。
-u手动解锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。
-n为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回1,并继续执行下面语句。
-w设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回1,并继续执行下面语句。
-o必须是使用第一种格式时才可用,表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。
-c执行其后的comand。
举个实用的例子:
  1. #!/bin/bash
  2. {
  3. flock -n 3
  4. [ $? -eq 1 ] && { echo fail; exit; }
  5. echo $$
  6. sleep 10
  7. } 3<>mylockfile
复制代码

此例的功能为当有一个脚本实例正在执行时,另一个试图执行该脚本的进程会失败退出。
sleep那句可以换成您需要执行的语句段。
这里请注意一点,我使用<>打开mylockfile,原因是定向文件描述符是先于命令执行的。因此假如在您要执行的语句段中需要读写mylockfile文件,例如想获得上一个脚本实例的pid,并将此次的脚本实例的pid写入mylockfile。此时直接用>打开mylockfile会清空上次存入的内容,而用<打开mylockfile当它不存在时会导致一个错误。当然这些问题都可以用其他方法解决,我只是点出这种最通用的方法。

阅读(1344) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

qibotang2011-05-23 15:26:47

结合我自己的例子:
suse 10sp2企业版 flock版本老,下载一个
ftp://ftp.kernel.org/pub/linux/utils/util-linux/
ftp://ftp.kernel.org/pub/linux/utils/util-linux/v2.17/util-linux-ng-2.17.2.tar.gz
编译安装后就可以使用
下面是我自己的脚本

#!/bin/bash
source /home/tbq/.profile
T=`date +%Y%m%d%H