debian 重复执行sh_在shell中实现排它锁以避免脚本重复执行

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

这样是不是也可以呢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值