问题的背景:
我们常常需要通过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: 显示版本
锁类型:
共享锁:多个进程可以使用同一把锁,常被用作读共享锁
独占锁:同时只允许一个进程使用,又称排他锁,写锁。
这里我们需要同时只允许一个进程使用,所以使用独占锁。
修改后的定时任务如下:--------------------- 1 * * * * flock -xn /tmp/XXX.lock -c /XX/XX/PHP /XX/XX/a.PHP
总结以上是内存溢出为你收集整理的linux crontab 防止周期内为执行完成重复执行全部内容,希望文章能够帮你解决linux crontab 防止周期内为执行完成重复执行所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)