Linux 2.6 中的文件锁
flock——Linux 下的文件锁
我在我的CentOS 5.8上做了一个简单的测试:
1.准备一个file-lock-test.sh脚本:
引用
#/bin/bash
echo ""
echo "---------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'`..."
sleep 140s
echo "finished at `date '+%Y-%m-%d %H:%M:%S'`..."
2.测试排它锁
在crontab中定义如下一个定时任务(每分钟执行一次)
引用
* * * * * flock -xn /dev/shm/test.lock -c "sh /opt/gaosong/file-lock-test.sh >> /opt/gaosong/stdout.log"
输出日志文件如下:
引用
---------------------------------
start at 2013-08-09 11:36:01...#获取到锁
finished at 2013-08-09 11:38:21...#此时释放所
---------------------------------
start at 2013-08-09 11:39:01... #11:38:00启动的定时任务由于拿不到锁,所以马上退出了,导致11:39:00才能拿到锁
finished at 2013-08-09 11:41:21...
3.测试排它锁+等待超时
将定时任务改为:
引用
* * * * * flock -x -w 30 /dev/shm/test.lock -c "sh /opt/gaosong/file-lock-test.sh >> /opt/gaosong/stdout.log"
输出日志文件如下:
引用
---------------------------------
start at 2013-08-09 11:42:01...
finished at 2013-08-09 11:44:21...
---------------------------------
start at 2013-08-09 11:44:21...#11:44:00启动的定时任务等待了20秒后,上一个任务释放了锁,所以此任务可以马上拿到锁,并继续执行
finished at 2013-08-09 11:46:41...
0
顶
0
踩
分享到:
2013-08-09 18:39
浏览 7391
评论
2 楼
blueswind8306
2013-08-14
lionfox 写道
如果用进程id &进程名字 结合ps -ef | grep id | grep name|wc -l
这样是不是也可以呢
这样有并发问题,类似如下伪代码:
pid=`cat pidfile`
process=`ps -ef |grep $pid |grep name|wc -l`
if [ $process -eq 0 ]; then
echo $$ > pidfile
do something...
fi
如果同时有两个进程同时执行到if判断这行,可能两个进程都得到true的结果,这时候就会出现同时执行的情况,并且后一个进程会覆盖写入前一个进程的pidfile。
但对于flock命令则不同,它会直接尝试对某个文件加锁,并且加锁操作是原子的,这样如果进程1加锁成功,进程2就一定加锁失败并返回(或者阻塞等待锁释放)。
具体可以参考:Linux 2.6 中的文件锁这篇文章的“Linux 中关于文件锁的系统调用”这段
1 楼
lionfox
2013-08-09
如果用进程id &进程名字 结合ps -ef | grep id | grep name|wc -l
这样是不是也可以呢