问题的背景:

我们常常需要通过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"

开心吗

最新文章

  1. java多线程解读二(内存篇)
  2. XUtils 3 使用
  3. three.js 显示一个绿色的正方体
  4. Zabbix3.0+CentOS7.0+MariaDB5.5监视服务器安装
  5. Jquery Mobile局部刷新后js和css失效,需局部渲染
  6. cocos2d-x 常规库的图文件配置
  7. unity3d 学习笔记(一)
  8. OpenGLES 怎样在十天内掌握线性代数 - 希望这是真的!
  9. ML笔记_机器学习基石01
  10. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新
  11. java连接数据库读取数据出现乱码
  12. python全栈开发day21-2 几个装饰器总结
  13. 批处理DOS基础命令
  14. POJ 2976 Dropping tests (0/1分数规划)
  15. IntelliJ IDEA推荐插件
  16. RM报表,点击保存,为何每次都显示 另存为的对话框?
  17. jenkins定时构建
  18. 前端工程构建工具——Yeoman
  19. 使用Powershell 管理 Windows 2012 hyper-v复制
  20. jstl错误排除:According to TLD or attribute directive in tag file, attribute value does not accept any expressions

热门文章

  1. spark集群安装并集成到hadoop集群
  2. Once in a casino CodeForces - 1120B (暴力)
  3. Nginx server配置
  4. C# Entity Framework The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
  5. (十五)struts2之注解
  6. 图像识别领域的一些code
  7. 美化linux客户端zsh和oh-my-zsh
  8. JS 学习书籍电子版PDF下载
  9. ORACLE 存储过程提高
  10. SpringMVC返回void的三大方法