发布于 2026-01-06 0 阅读
0

Rails 中的定时任务:如何真正使用 Whenever gem(现在支持任务!)的简单指南 什么是定时任务?在 Rails 中使用 Whenever 来执行定时任务 由 Mux 呈现的 DEV 全球展示挑战赛:展示你的项目!

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
Enter fullscreen mode Exit fullscreen mode

2. 在 schedule.rb 中安排你的 cron 作业

config/schedule.rb是用于指定何时执行作业的文件,以及 Rake 任务的名称(同样,实际的任务应该写在单独的文件中)。

在 Rails 应用根目录下执行以下命令以创建该schedule.rb文件:

bundle exec wheneverize .
Enter fullscreen mode Exit fullscreen mode

现在,请在此处填写您的作业具体信息schedule.rb。例如,如果您希望batch:send_messages每分钟执行一次 Rake 任务:

every 1.minute do
  rake 'batch:send_messages'
end
Enter fullscreen mode Exit fullscreen mode

你也可以这样做every 2.hoursevery 1.day等等。

3. 将whenever任务写入你的 crontab 文件中

whenever你的任务写入 crontab 文件中。

bundle exec whenever --update-crontab
Enter fullscreen mode Exit fullscreen mode

重要
Whenever提示:在写入 crontab 时,请考虑您的 Rails 应用环境。如果您正在使用该development环境,请使用以下选项运行命令(默认值为production)。

whenever --update-crontab --set environment='development'
Enter fullscreen mode Exit fullscreen mode

供您参考,运行此命令后,您的 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

Enter fullscreen mode Exit fullscreen mode

其他命令

  • 显示 crontab:crontab -l
  • 清除你的 crontab whenever taskbundle 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
Enter fullscreen mode Exit fullscreen mode

现在编写你的任务,它接受两个参数: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
Enter fullscreen mode Exit fullscreen mode

您可以通过从命令行执行以下 Rake 任务来测试它。

rails batch:send_messages
Enter fullscreen mode Exit fullscreen mode

感谢阅读!

文章来源:https://dev.to/risafj/cron-jobs-in-rails-a-simple-guide-to-actually-using-the-whenever-gem-now-with-tasks-2omi