Crontab避免周期内未执行完重复执行

如果某脚本要运行30分钟,可以在Crontab里把脚本间隔设为至少一小时来避免冲突。而比较糟的情况是可能该脚本在执行周期内没有完成,接着第二个脚本又开始运行了。如何确保只有一个脚本实例运行呢? 一个好用的方法是利用lockf(FreeBSD 8.1下为lockf,CentOS 5.5下为flock),在脚本执行前先检测能否获取某个文件锁,以防止脚本运行冲突。
lockf的参数如下:
-k:一直等待获取文件锁。
-s:silent,不发出任何信息,即使拿不到文件锁。
-t seconds:设定timeout的时间是seconds秒,如果超过时间,则自动放弃。
flock -xn my.lock command
my.lock是一个文件,应该可以是任意文件,可以新建一个空文件。
当flock 获得锁后就会执行后面的 command
crontab示例:
30 23 * * * flock -xn /tmp/my.lock -c '/usr/local/php test.php'
*/5 * * * * /usr/bin/flock -xn /var/run/up_svn.lock -c'/scripts/up_svn.sh >/dev/null2>&1'
测试实例:
[hadoop@emr-worker-10 love]$ cat task.sh 
#! /bin/bash
echo haha
sleep 10
echo hhheee
terminal:
[hadoop@emr-worker-10 love]$ flock -xn test.lock -c 'sh task.sh'
crontab:
*/5 * * * * flock -xn /tmp/my.lock -c 'sh /home/hadoop/nisj/love/task.sh'

猜你喜欢

转载自blog.csdn.net/babyfish13/article/details/79531224