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


当前回答

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

这里有一个例子:

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环境。如果您只需要向数据库中插入一些记录,这将使用您实际上不必使用的内存。如果您编写自己的脚本,则可以避免这种情况。实际上我还没有必要这么做,但我正在考虑。

其他回答

下面是我如何设置我的cron任务。我有一个每天备份SQL数据库(使用rake)和另一个每月过期缓存一次。任何输出都记录在文件log/cron_log中。我的crontab是这样的:

crontab -l # command to print all cron tasks
crontab -e # command to edit/add cron tasks

# Contents of crontab
0 1 * * * cd /home/lenart/izziv. whiskas.si/current; /bin/sh cron_tasks >> log/cron_log 2>&1
0 0 1 * * cd /home/lenart/izziv.whiskas.si/current; /usr/bin/env /usr/local/bin/ruby script/runner -e production lib/monthly_cron.rb >> log/cron_log 2>&1

第一个cron任务每天备份数据库。cron_tasks的内容如下:

/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";

第二个任务稍后设置,并使用脚本/运行器每月过期一次缓存(lib/monthly_cron.rb):

#!/usr/local/bin/ruby
# Expire challenge cache
Challenge.force_expire_cache
puts "Expired cache for Challenges (Challenge.force_expire_cache) #{Time.now}"

我想我可以用其他方式备份数据库,但到目前为止,它适合我:)

rake和ruby的路径在不同的服务器上可能不同。你可以使用以下命令查看它们的位置:

whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake

我使用backgrounddrb。

http://backgroundrb.rubyforge.org/

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

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

这里有一个例子:

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环境。如果您只需要向数据库中插入一些记录,这将使用您实际上不必使用的内存。如果您编写自己的脚本,则可以避免这种情况。实际上我还没有必要这么做,但我正在考虑。

有意思的是没人提到Sidetiq。 如果你已经在使用Sidekiq,这是一个很好的补充。

Sidetiq提供了一个简单的API,用于为 Sidekiq。

Job看起来是这样的:

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { hourly.minute_of_hour(15, 45) }

  def perform
    # do stuff ...
  end
end

我最近为我一直在做的项目创建了一些cron作业。

我发现宝石发条非常有用。

require 'clockwork'

module Clockwork
  every(10.seconds, 'frequent.job')
end

你甚至可以使用这个宝石来安排你的后台工作。 有关文档和进一步帮助,请参阅https://github.com/Rykian/clockwork