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


当前回答

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

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

require 'clockwork'

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

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

其他回答

我正在使用耙方法(由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)直接在你选择的排队系统上排队任务

我曾经也做过同样的决定,今天我对这个决定很满意。使用resque调度程序,因为不仅一个单独的redis会从你的数据库中取出负载,你还可以访问许多插件,如resque-web,它提供了一个伟大的用户界面。随着系统的发展,你会有越来越多的任务要安排,这样你就可以从一个地方控制它们。

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

这里有一个例子:

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,这是运行cron的最好方式。 这里有一些cron的例子,

打开CronTab - > sudo CronTab -e

并粘贴波纹线:

00 00 * * * wget https://your_host/some_API_end_point

这里有一些cron格式,对你有帮助

::CRON FORMAT::

Examples Of crontab Entries
15 6 2 1 * /home/melissa/backup.sh
Run the shell script /home/melissa/backup.sh on January 2 at 6:15 A.M.

15 06 02 Jan * /home/melissa/backup.sh
Same as the above entry. Zeroes can be added at the beginning of a number for legibility, without changing their value.

0 9-18 * * * /home/carl/hourly-archive.sh
Run /home/carl/hourly-archive.sh every hour, on the hour, from 9 A.M. through 6 P.M., every day.

0 9,18 * * Mon /home/wendy/script.sh
Run /home/wendy/script.sh every Monday, at 9 A.M. and 6 P.M.

30 22 * * Mon,Tue,Wed,Thu,Fri /usr/local/bin/backup
Run /usr/local/bin/backup at 10:30 P.M., every weekday. 

希望这对你有帮助:)

我是资源调度程序的忠实粉丝。您不仅可以重复运行类似cron的任务,还可以在特定时间运行任务。缺点是,它需要一个Redis服务器。