Crontab 里解决脚本冲突的问题

Linux里的Crontab是一个好东西,但是它的默认最小执行频率是1分钟,但是我们在实际生产环境里有的时候遇到的脚本执行时间是大于1分钟的,这样就会出现一个很尴尬的情况,就是在1分钟过后,系统进程会出现多个脚本,neck and neck式的在后台运行,比如这样:

从上面的图可以看到,10点36分log499.sh没有执行完毕,10点37又开始了执行了一个新的log499.sh脚本。这种脚本冲突肯定不是我们所希望的,那么如何才能保证后台只是在一段时间里只执行一个脚本呢?

这个时候我们就要使用文件锁,flock,这种方法要比判断pid高大上的多。

首先假设我们的脚本名字叫abc.sh,这个脚本文件的执行时间是要大于1分钟的,同时我们再设定一个锁文件,位置就放在/tmp/abc.lock,这个文件可以是空的,然后# crontab -e,添加一句命令如下:

* * * * * flock -xn /tmp/abc.lock -c ‘sh /路径/abc.sh >> /记录日志的路径 2>&1‘

这个时候静候crontab启动abc.sh,通过# ps -ef|grep abc,发现在后台始终只有一个abc进程。

但是有的时候会有这样的一个问题,就是abc执行一次之后,在下一次该执行的时候却没有执行,好像crontab失效了一样,对于这样的情况,就需要添加下面的语句到abc.sh末尾:

rm -rf /tmp/abc.lock      #删除掉原有的锁文件
sleep n                      #睡n秒
touch /tmp/abc.lock     #再新建一个锁文件

这样不断地更新lock锁文件,就会保证crontab每次都会按期执行。

这里要注意一下,里面我加了一句sleep n,这里的n是为了跨分钟的存在,这是为了防止没有走到下一个分钟又会生成一个新的lock锁文件,这样还是会出现重复启动脚本的情况。

这里就涉及到flock的一个原理:在每一次执行任务的时候都会先去尝试取到锁文件,如果取到了锁文件,那么就会下一步,反之就会放弃执行。A任务在运行的时候已经占据了lock文件,那么B任务来了,发现没有lock了,就不会执行任务。

这里我们使用了flock的三个参数:

-x, --exclusive: 获得一个独占锁

-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待

-c, --command:   在shell中运行一个单独的命令

当然,flock还是有很多丰富的参数可以供各位使用,大家就各自去百度一下吧。

参考资料:http://blog.csdn.net/fdipzone/article/details/38284009

时间: 2024-12-28 20:24:24

Crontab 里解决脚本冲突的问题的相关文章

crontab里shell脚本将top信息写入文件

crontab里shell脚本将top信息写入文件: 注: 1.top -n 1代表执行1次退出(默认top是不退出的),-d 1代表每1秒执行1次 2.crontab里需加/bin/bash # crontab -e */5 * * * * /bin/bash /usr/local/bin/top.sh # vi top.sh #!/bin/bash Date=`date +%Y%m%d` Date2=`date +%Y%m%d_%H%M` Date3=`date +%Y%m%d -d "7

Crontab里调用python脚本不成功的解决方案

crontab里经常会调用一些程序,但是很多时候调用python是不成功的,但是手动则是OK的,在看日志(/var/log/cron)的时候,却是显示正常,这种情况怎么破呢?其实主要就是这么几个地方: 1)轻易不要用if __name__ == "__main__": 很多主管都习惯让自己手下人把脚本写成模块化,然后潇洒的走一个整合,但是crontab对这个方法似乎不是很灵光,因为python运行的时候是从if __name__ == "__main__"开始执行,

大开测试:性能—如何解决脚本中的乱码问题(连载7)

7.7  如何解决脚本中的乱码问题 1.问题提出 平时在对Web应用程序性能测试的时候,可能会出现录制的脚本中汉字变为乱字符的现象. 2.问题解答 在所有字符集中,最知名的可能要数被称为ASCII的7位字符集了.它是美国信息交换标准委员会(AmericanStandards Committee for Information Interchange)的缩写,为美国英语通信所设计.它由128个字符组成,包括大小写字母.数字0-9.标点符号.非打印字符(换行符.制表符等4个)以及控制字符(退格.响铃

crontab 里无法执行expdp

编辑个脚本 xxx.sh #!/bin/shrq=`date +%Y%m%d`filename="test$rq"expdp system/*** directory=expdump dumpfile=$filename.dmp logfile=$filename.log schemas=test content=data_only 手工可以执行OK,满以为都OK 结果放进了CRONTAB里 第二天却没有执行,被叼毛叼了几句! 原因可能有: 1 环境问题  最好来个  source ~

JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突

文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 6.JavaScript命名推荐 7.JavaScript解决命名冲突 1. JavaScript发展史 1.Netscape发明了JavaScript(1992年后) 1)出现JavaScript的原因(Netscape Navigator) * 网络的不断普及与推广,有庞大的用户量 * 因为当

单独运行shell脚本与crontab运行shell脚本的区别

crontab运行脚本存在两大问题:环境变量和路径,从而导致单独运行脚本没问题,但用crontab运行就报错. 1.环境变量 描述问题:crontab: usage error: no arguments permitted after this option 因为crontab不提供环境,所以需要自己在shell中加入,或者全部用绝对路径.简单的方法:控制台输入 [[email protected] ~]# echo $PATH /your/path/1:/your/path/2------

crontab 里 % 引发的问题

写个 crontab ,命令是类似这样的 /path/to/script `date +%Y-%m-%d` 直接运行很正常,但是在 crotnab 里就出错. /bin/sh: -c: line 1: unexpected EOF while looking for matching ``'/bin/sh: -c: line 2: syntax error: unexpected end of file google 了好一阵才找到答案.原来 crontab 里的 % 是有特殊意义的,在这里需要

linux crontab 计划任务脚本

在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出. 在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间. cron的配置文件称为"crontab",是"cron table"的简写. 一.cron在3个地方查找配置文件:1./var/spool/

解决 Git 冲突的 14 个建议和工具

Git 非常善于合并代码.代码的合并在本地完成,快速而且灵活.正常情况下每次从不同分支合并内容时,冲突有可能会发生.通常解决冲突很简单,就如同知道(如何)选择(保留)重要的更改一样,而有时解决冲突则需要额外的工作. 每个开发者对于解决冲突有不同的偏好.不久前,一位叫丹·史蒂文斯的同事用内部软件 Questions for Confluence 询问了大家是如何做的. 收集到的回答和看法比 Atlassian 之墙有更大的吸引力.下面是我们用多种方式解决 Git 冲突的详尽描述,希望它能提供一些可