如何使用Rails防止重叠的cron作业?

Pra*_*oya 3 ruby-on-rails crontab race-condition whenever

我有一个cron作业设置,每5分钟运行一次任务.但有时该任务需要> 5分钟才能运行,因此该任务的另一个副本由cron同时运行.在运行另一个副本之前,我们是否有办法让它等待另一个工作完成?

Mou*_*mir 5

AFAIK您无法随时使用它,但您可以在脚本中处理此问题.这可以通过以下解决方案之一来完成

  1. 使用在作业开始时设置并在作业结束时清除的标志(或某些信息,如开始时间,结束时间,成功状态)在数据库中处理此项,并在每次作业开始查看上一个作业是否完成时检查此标志或不; 但请确保处理异常,就好像进程在清除标志之前死亡一样,其他进程也无法运行

  2. 您可以通过创建临时文件并为当前进程对其进行独占锁定来使操作系统作为标志工作,因此在当前进程完成之前没有其他进程可以对此文件进行独占锁定,然后进程完成它将释放锁并让其他进程工作.要做到这一点,包括这是你的cron工作的首要任务

    file = File.new("cron.lock", "a")
    can_lock = file.flock(File::LOCK_EX | File::LOCK_NB)
    
    if can_lock == false
      exit 1
    else
      #do whatever you want
    end
    
    Run Code Online (Sandbox Code Playgroud)

第二种方法的优点是即使进程意外终止,操作系统也会自动释放锁

对我来说,我选择了第一种方法,因为如果前一个过程完成或花费的时间超过特定时间限制,我需要启动另一个过程

有关详细信息,请查看此链接