Rails 中的定时任务:如何真正使用 Whenever gem(现在支持任务!)的简单指南
什么是定时任务?
whenever在 Rails 中用于 cron作业
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
我有机会whenever在 Rails 中使用 `scheduled_task` 来调度任务,并写下这篇文章以供将来参考。我知道 Rails 中还有其他方法可以调度定期任务,但这可能是最简单的方法之一。
注意:本指南适用于 Linux 或 macOS 系统。
什么是定时任务?
Cron 是一个任务调度器,它允许你在固定时间(例如每分钟、每小时、每天下午 3 点)执行重复性任务。
任务编写在一个名为crontab(“cron 表”的缩写)的文件中,通常保存在这里:/usr/bin/
whenever在 Rails 中用于 cron作业
Whenever是一个可以帮助你设置定时任务的 gem。你无需手动编辑 crontab 文件,只需whenever用 Ruby 代码编写任务,它就能自动更新 crontab 文件。你可以在代码中进行编辑。schedule.rb
注意:需要说明的是,实际的任务本身(在我的例子中是定期发送批量消息)不应该写在 crontab 文件中,也不schedule.rb应该写在 Rails 的 crontab 配置文件中。该任务应该单独写成一个 Rake 任务。然后,你可以将该 Rake 任务作为 cron 作业定期调度执行。
步骤
1. 安装whenever
将其包含在您的应用程序的 .htm 文件中Gemfile,然后运行bundle以进行安装。
gem 'whenever', require: false
2. 在 schedule.rb 中安排你的 cron 作业
config/schedule.rb是用于指定何时执行作业的文件,以及 Rake 任务的名称(同样,实际的任务应该写在单独的文件中)。
在 Rails 应用根目录下执行以下命令以创建该schedule.rb文件:
bundle exec wheneverize .
现在,请在此处填写您的作业具体信息schedule.rb。例如,如果您希望batch:send_messages每分钟执行一次 Rake 任务:
every 1.minute do
rake 'batch:send_messages'
end
你也可以这样做every 2.hours,every 1.day等等。
3. 将whenever任务写入你的 crontab 文件中
把whenever你的任务写入 crontab 文件中。
bundle exec whenever --update-crontab
重要Whenever提示:在写入 crontab 时,请考虑您的 Rails 应用环境。如果您正在使用该development环境,请使用以下选项运行命令(默认值为production)。
whenever --update-crontab --set environment='development'
供您参考,运行此命令后,您的 crontab 将如下RAILS_ENV所示development:
# Begin Whenever generated tasks for: /Users/<USER>/<APPNAME>/config/schedule.rb at: 2019-01-14 18:15:41 +0900
* * * * * /bin/bash -l -c 'cd /Users/<USER>/<APPNAME> && RAILS_ENV=development bundle exec rake batch:send_messages --silent'
# End Whenever generated tasks for: /Users/<USER>/<APPNAME>/config/schedule.rb at: 2019-01-14 18:15:41 +0900
其他命令
- 显示 crontab:
crontab -l - 清除你的 crontab
whenever task:bundle exec whenever --clear-crontab
4. 创建 Rake 任务
Rake 任务遵循特定的命名约定——命名空间和任务名称。命名空间用于将某些任务分组在一起。例如,在下面的例子中,如果您有多个批处理任务,可以将它们全部放在同一个命名空间下batch。
为你的 Rake 任务生成一个文件lib/tasks/batch.rake。它们遵循以下格式:
rails g task <NAMESPACE> <TASKNAME>
因此,为了send_messages在命名空间中生成我们的任务batch,我们将在终端中输入以下命令:
rails g task batch send_messages
现在编写你的任务,它接受两个参数:desc,这是你的任务的任意描述,以及task,这是要执行的代码。
例如:
namespace :batch do
desc 'Send out batch messages'
task send_messages: :environment do
# The code to actually send our messages would go here
end
end
您可以通过从命令行执行以下 Rake 任务来测试它。
rails batch:send_messages
感谢阅读!
文章来源:https://dev.to/risafj/cron-jobs-in-rails-a-simple-guide-to-actually-using-the-whenever-gem-now-with-tasks-2omi