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"

开心吗😺?

posted @ 2019-03-18 13:45  专心写代码  阅读(3138)  评论(0编辑  收藏  举报