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


当前回答

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

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

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

我希望这能有所帮助!

其他回答

我正在使用耙方法(由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和resque- scheduling gem来创建cron,这很容易做到。

https://github.com/resque/resque

https://github.com/resque/resque-scheduler

我使用脚本运行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作业。

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

require 'clockwork'

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

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

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

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

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