jes*_*199 294 cron rake daemon ruby-on-rails runner
在Rails环境中运行计划任务的最佳方法是什么?脚本/亚军?耙?
Jim*_*vin 254
我在非常受欢迎的Whenever用于严重依赖计划任务的项目,这很棒.它为您提供了一个很好的DSL来定义您的计划任务,而不必处理crontab格式.来自README:
每当Ruby gem为编写和部署cron作业提供清晰的语法时.
自述文件中的示例:
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
Run Code Online (Sandbox Code Playgroud)
tar*_*ate 110
我正在使用rake方法(由heroku支持)
使用名为lib/tasks/cron.rake的文件..
task :cron => :environment do
puts "Pulling new requests..."
EdiListener.process_new_messages
puts "done."
end
Run Code Online (Sandbox Code Playgroud)
要从命令行执行,这只是"rake cron".然后可以根据需要将此命令放在操作系统cron/task scheduler上.
更新这是一个很老的问题和答案!一些新信息:
小智 19
在我们的项目中,我们首先使用gem,但遇到了一些问题.
然后我们切换到RUFUS SCHEDULER gem,结果证明在Rails中调度任务非常容易和可靠.
我们已经将它用于发送每周和每日邮件,甚至用于运行一些定期的佣金任务或任何方法.
这里使用的代码如下:
require 'rufus-scheduler'
scheduler = Rufus::Scheduler.new
scheduler.in '10d' do
# do something in 10 days
end
scheduler.at '2030/12/12 23:30:00' do
# do something at a given point in time
end
scheduler.every '3h' do
# do something every 3 hours
end
scheduler.cron '5 0 * * *' do
# do something every day, five minutes after midnight
# (see "man 5 crontab" in your terminal)
end
Run Code Online (Sandbox Code Playgroud)
要了解更多信息,请访问:https://github.com/jmettraux/rufus-scheduler
Fre*_*ent 17
假设您的任务完成时间不长,只需创建一个新控制器,并为每个任务执行操作.将任务的逻辑实现为控制器代码,然后在操作系统级别设置一个cronjob,使用wget以适当的时间间隔调用此控制器的URL和操作.这种方法的优点是:
web*_*mat 10
脚本/跑步者和rake任务完全可以作为cron作业运行.
这是运行cron作业时必须记住的一件非常重要的事情.它们可能不会从您应用的根目录中调用.这意味着您对文件的所有要求(与库相对)应该使用显式路径:例如File.dirname(__ FILE__)+"/ other_file".这也意味着你必须知道如何从另一个目录显式调用它们:-)
检查您的代码是否支持从另一个目录运行
# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development
Run Code Online (Sandbox Code Playgroud)
此外,cron作业可能不会像你一样运行,所以不要依赖你放在.bashrc中的任何快捷方式.但这只是一个标准的cron提示;-)
Abd*_*bdo 10
每次(和cron)的问题是它每次执行时都会重新加载rails环境,这在你的任务频繁或需要进行大量初始化工作时才是真正的问题.因此我在制作方面遇到了问题,必须警告你.
Rufus调度程序为我做(https://github.com/jmettraux/rufus-scheduler)
当我有很长的工作要运行时,我将它用于delayed_job(https://github.com/collectiveidea/delayed_job)
我希望这有帮助!
有趣的是没有人提到Sidetiq.如果您已经使用Sidekiq,这是很好的补充.
Sidetiq提供了一个简单的API,用于定义Sidekiq的重复工作者.
工作将如下所示:
class MyWorker
include Sidekiq::Worker
include Sidetiq::Schedulable
recurrence { hourly.minute_of_hour(15, 45) }
def perform
# do stuff ...
end
end
Run Code Online (Sandbox Code Playgroud)
两者都可以.我通常使用脚本/跑步者.
这是一个例子:
0 6 * * * cd /var/www/apps/your_app/current; ./script/runner --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1
如果加载正确的配置文件以连接到数据库,也可以编写纯Ruby脚本来执行此操作.
如果内存很珍贵,要记住的一件事是脚本/运行程序(或依赖于'环境'的Rake任务)将加载整个Rails环境.如果您只需要将一些记录插入数据库,那么这将使用您实际不需要的内存.如果您编写自己的脚本,则可以避免这种情况.我还没有真正需要这样做,但我正在考虑它.
使用 Sidekiq 或 Resque 是一个更强大的解决方案。它们都支持重试作业、具有 REDIS 锁的排他性、监控和调度。
请记住,Resque 是一个死项目(未积极维护),因此 Sidekiq 是更好的选择。它的性能也更高:Sidekiq 在单个多线程进程上运行多个 worker,而 Resque 在单独的进程中运行每个 worker。
归档时间: |
|
查看次数: |
101887 次 |
最近记录: |