在Rails环境中运行计划任务的最佳方法是什么?脚本/跑步吗?耙?我想每隔几分钟运行一次任务。


当前回答

无论何时(和cron)的问题是,它每次执行时都会重新加载rails环境,当任务频繁或有大量初始化工作要做时,这是一个真正的问题。由于这个原因,我在生产中出现了问题,必须警告你。

Rufus调度器为我做(https://github.com/jmettraux/rufus-scheduler)

当我有较长的作业要运行时,我使用delayed_job (https://github.com/collectiveidea/delayed_job)

我希望这能有所帮助!

其他回答

我不太确定,我猜这取决于任务:多长时间运行一次,有多复杂,需要与rails项目进行多少直接交流等等。我想如果做一件事只有“一种最好的方法”,就不会有那么多不同的方法了。

在我在Rails项目中的上一份工作中,我们需要制作一个批量邀请邮件(调查邀请,而不是垃圾邮件),它应该在服务器有时间的时候发送计划好的邮件。我认为我们将使用守护进程工具来运行我创建的rake任务。

不幸的是,我们公司遇到了一些资金问题,被主要竞争对手“收购”了,所以这个项目一直没有完成,所以我不知道我们最终会用什么。

两者都可以正常工作。我通常使用脚本/运行器。

这里有一个例子:

0 6 * * * CD /var/www/apps/your_app/current;./script/runner——环境生产'EmailSubscription. /Send_email_subscriptions的>> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1

如果加载正确的配置文件来连接数据库,也可以编写一个纯ruby脚本来完成此操作。

如果内存很宝贵,需要记住的一件事是脚本/运行器(或依赖于“环境”的Rake任务)将加载整个Rails环境。如果您只需要向数据库中插入一些记录,这将使用您实际上不必使用的内存。如果您编写自己的脚本,则可以避免这种情况。实际上我还没有必要这么做,但我正在考虑。

我正在使用耙方法(由heroku支持)

使用名为lib/tasks/cron的文件。rake . .

task :cron => :environment do
  puts "Pulling new requests..."
  EdiListener.process_new_messages
  puts "done."
end

要从命令行执行,这就是“rake cron”。然后可以根据需要将此命令放到操作系统cron/任务调度程序上。

更新这是一个相当老的问题和答案!一些新信息:

我引用的heroku cron服务已经被heroku Scheduler所取代 对于频繁的任务(特别是当你想避免Rails环境启动成本时),我的首选方法是使用系统cron来调用一个脚本,该脚本将(a)戳一个安全/私有webhook API来在后台调用所需的任务,或者(b)直接在你选择的排队系统上排队任务

我使用backgrounddrb。

http://backgroundrb.rubyforge.org/

我用它来运行预定的任务以及对于正常的客户机/服务器关系花费太长时间的任务。

Script /runner和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

此外,cron作业可能不会像你那样运行,所以不要依赖于你在.bashrc中放入的任何快捷方式。但这只是一个标准的cron提示;-)