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)
此外,您可以使用锁文件,但在任务中处理它:
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)
这可能会被提取到某种模块中,但你明白了.
对此的一般非rake特定解决方案是使用pid文件作为锁.你可以将rake任务包装在一个脚本中,该脚本在运行rake时创建该文件,在rake完成运行时将其删除,并在开始之前检查它.
不确定rake是否内置了什么,我什么都不知道.