只有在没有运行rake任务时才能以某种方式执行rake任务, 我想使用cron执行一些rake任务,但如果之前的调用没有完成,则rake任务不应该启动 感谢
答案 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任务很频繁,这个特别有用。