转载部分:
在做计划任务的时候,可能由于某些问题,任务没有执行完成,导致任务重复的运行,解决这个问题,只需要一个flock命令就可以了。
flock --help
flock (util-linux-ng 2.17.2)
Usage: flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...
flock [-sxon][-w #] directory [-c] command...
-s --shared Get a shared lock #获得一个共享锁
-x --exclusive Get an exclusive lock #获得一个独占锁,这是默认的
-u --unlock Remove a lock #删除一个锁,通常是不需要的,因为在文件关闭时锁会自动删除
-n --nonblock Fail rather than wait #如果没有立即获得锁,直接失败而不是等待
-w --timeout Wait for a limited amount of time #如果没有立即获得锁,等待指定时间
-o --close Close file descriptor before running command #在执行命令之前关闭保持锁的文件描述符
-c --command Run a single command string through the shell #在shell中运行一个单独的命令
-h --help Display this text #显示帮助
-V --version Display version #显示版本
例:
我要用rsync计划任务做同步,写了一个rsync同步脚本whsir.sh,设置了30分钟同步一次服务端,但是可能由于其他某些因素导致,30分钟内没有同步完成,后台还会继续执行此计划任务,此时就能看到两个rsync同步同时在跑,这时候我们就需要flock命令来解决问题了。
原来我的计划任务:
*/30 * * * * /www/whsir.sh
使用flock后的计划任务:
*/30 * * * * flock -xn /tmp/demo.lock -c /www/whsir.sh
这样的话,当前计划任务whsir.sh如果没有运行完,下一个任务会判断demo.lock被锁定,直接失败,等待下次在判断。
原创部分:
==========如下是比较简单的实验==========
1.我们先创建一个叫做“flock-test.sh”的脚本,脚本内容为
#!/bin/bash echo "This is a system flock test script" echo "Sleeping 100 second" sleep 100
2.使用“flock -xn /tmp/flock.lock ./flock-test.sh”命令执行这个脚本,结果可以看到,执行成功
3.重新打开一个终端界面,进入脚本目录后继续使用“flock -xn /tmp/flock.lock ./flock-test.sh”命令启动脚本,可以看到脚本并没有执行,而是直接退出了,为什么呢?因为脚本第一次运行的时候在等待100秒没有执行完成,他创建的锁还没有释放,所以想要再次运行这个脚本的时候会直接退出了!
4.我们再来试一下-w参数,先把已经运行的脚本全部关闭掉,然后重新启动一个脚本。
5.我们再第二个终端使用“flock -xw 5 /tmp/flock.lock ./flock-test.sh”命令启动脚本。
第一种结果:不做任何操作,你会发现脚本并没有立刻退出而是5秒钟之后才会退出。
第二种结果:在等待期间强行结束掉第一个执行的脚本,你会发现处在等待状态的脚本会开始运行(要在5秒等待期之内结束掉)