rake检查是否已经运行

时间:2011-09-06 13:54:41

标签: ruby-on-rails ruby ruby-on-rails-3 rake rake-task

只有在没有运行rake任务时才能以某种方式执行rake任务, 我想使用cron执行一些rake任务,但如果之前的调用没有完成,则rake任务不应该启动 感谢

4 个答案:

答案 0 :(得分:12)

我使用lockrun来阻止cron任务多次运行(这只有在通过相同的lockrun调用调用命令时才有效,所以如果你需要保护各种调用路径,那么你'我需要寻找其他方法。)

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

*/5 * * * * /usr/local/bin/lockrun --lockfile=/tmp/this_task.lockrun -- cd /my/path && RAILS_ENV=production bundle exec rake this:task

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

如果您只是想跳过此rake任务,您还可以使用数据库存储有关任务进度的信息(例如,在启动和完成给定任务时更新字段)并在运行每个任务之前检查该信息。 / p>

但是,如果您想要类似队列的行为,则可能需要考虑创建一个守护程序来处理任务。这个过程非常简单,可以让您获得更多控制权。有一个关于这个的非常好的轨道广播:Custom Daemon

守护进程方法还将阻止在每个任务上再次加载rails环境。如果你的rake任务很频繁,这个特别有用。