linux crontab 防止周期内为执行完成重复执行
问题的背景:
我们常常需要通过crontab部署某个脚本运行某些定时任务,但在实际的过程中,一旦处理不好可能导致在同一时刻出现脚本的多个运行副本,比如crontab的调度是每5 分钟运行一次脚本,如果运行的脚本能够在5分钟内处理完任务并退出,则没问题,同一时刻最多只有一个脚本在运行,但如果脚本如果无法在5分钟内处理完任务并退出,则意味着在下一个5分钟,脚本又会被crontab调起来,出现了同一时刻有2个甚至更多的脚本事例在运行,对应一些依赖关系,需要串行处理的脚本来说,可能会导致数据相互覆盖等问题。
为了解决这个问题,脚本必须能够自我保护,即在启动之前判断是否已经有脚本启动了,若当前已经有脚本启动了,则虽然crontab调度到该脚本,但脚本自身会马上退出。
解决问题的思路很多,其中一种比较简便的是:使用文件锁,在linux中,提供了flock命令,具体格式如下:
1, flock [-sxon] [-w timeout] lockfile [-c]command...
2, flock [-sxun] [-w timeout] fd
选项:
-s, --shared: 获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock: 移除一个锁,脚本执行完会自动丢弃锁
-n, --nonblock: 如果没有立即获得锁,直接失败而不是等待
-w, --timeout: 如果没有立即获得锁,等待指定时间
-o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command: 在shell中运行一个单独的命令
-h, --help 显示帮助
-V, --version: 显示版本
锁类型:
共享锁:多个进程可以使用同一把锁,常被用作读共享锁
独占锁:同时只允许一个进程使用,又称排他锁,写锁。
这里我们需要同时只允许一个进程使用,所以使用独占锁。
修改后的定时任务如下:日志为了方便排查问题
---------------------
* * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php >> /home/log/test.log 2>&1"
开心吗
最新文章
- java多线程解读二(内存篇)
- XUtils 3 使用
- three.js 显示一个绿色的正方体
- Zabbix3.0+CentOS7.0+MariaDB5.5监视服务器安装
- Jquery Mobile局部刷新后js和css失效,需局部渲染
- cocos2d-x 常规库的图文件配置
- unity3d 学习笔记(一)
- OpenGLES 怎样在十天内掌握线性代数 - 希望这是真的!
- ML笔记_机器学习基石01
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新
- java连接数据库读取数据出现乱码
- python全栈开发day21-2 几个装饰器总结
- 批处理DOS基础命令
- POJ 2976 Dropping tests (0/1分数规划)
- IntelliJ IDEA推荐插件
- RM报表,点击保存,为何每次都显示 另存为的对话框?
- jenkins定时构建
- 前端工程构建工具——Yeoman
- 使用Powershell 管理 Windows 2012 hyper-v复制
- jstl错误排除:According to TLD or attribute directive in tag file, attribute value does not accept any expressions
热门文章
- spark集群安装并集成到hadoop集群
- Once in a casino CodeForces - 1120B (暴力)
- Nginx server配置
- C# Entity Framework The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
- (十五)struts2之注解
- 图像识别领域的一些code
- 美化linux客户端zsh和oh-my-zsh
- JS 学习书籍电子版PDF下载
- ORACLE 存储过程提高
- SpringMVC返回void的三大方法