rake检查是否已经运行

Fiv*_*ell 9 ruby rake ruby-on-rails rake-task ruby-on-rails-3

是否有可能以某种方式执行rake任务只有它还没有运行,我想使用cron执行一些rake任务但是rake任务不应该在前一次调用未完成时启动谢谢

Jer*_*ers 13

我用lockrun防止后台任务运行多次(通过相同的调用指令时,这只能lockrun调用,所以如果你需要从不同的调用路径保护,那么你就需要寻找其他的方法).

在您的crontab中,您可以像这样调用它:

*/5 * * * * /usr/local/bin/lockrun --lockfile=/tmp/this_task.lockrun -- cd /my/path && RAILS_ENV=production bundle exec rake this:task
Run Code Online (Sandbox Code Playgroud)

  • 在某些系统上也有flock(经常在/ usr/bin/flock中) - 问题没有指定操作系统. (2认同)

mik*_*ter 9

此外,您可以使用锁文件,但在任务中处理它:

def lockfile
  # Assuming you're running Rails
  Rails.root.join('tmp', 'pids', 'leads_task.lock')
end

def running!
  `touch #{lockfile}`
end

def done!
  `rm #{lockfile}`
end

def running?
  File.exists?(lockfile)
end

task :long_running do
  unless running?
    running!
    # long running stuff
    done!
  end
end
Run Code Online (Sandbox Code Playgroud)

这可能会被提取到某种模块中,但你明白了.


spi*_*ike 5

对此的一般非rake特定解决方案是使用pid文件作为锁.你可以将rake任务包装在一个脚本中,该脚本在运行rake时创建该文件,在rake完成运行时将其删除,并在开始之前检查它.

不确定rake是否内置了什么,我什么都不知道.

  • 如果您将 PID 放入文件中,并检查它是否正在运行(而不仅仅是文件是否存在),您可能能够更可靠地删除锁定。 (2认同)