You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让whenever gem在我的Rails习惯追踪应用中正常工作?

习惯追踪应用whenever定时任务不生效问题排查(macOS环境)

我正在开发一款「习惯追踪」应用,需要每天自动创建Day模型实例。尝试用whenever gem部署定时任务,但无论设置分钟/小时/天周期,都无法生成新实例。已多次跟随教程操作、重新部署,均无效果。

相关代码

schedule.rb

every 3.minute do
  command "cd /Users/myusername/code/myusername/habit-tracker && bundle exec rails runner 'Day.create!'"
end

set :environment, "development"


# every 1.minute do
#   command "bundle exec rails runner Day.create!"
#   rake 'batch:create_day', environment: "development"
#   runner 'Day.create!', environment: "development"
# end

# every :minute do
#   command "bundle exec rails runner Day.create!"
#   rake 'batch:create_day', environment: "development"
#   runner 'Day.create!', environment: "development"
# end

batch.rake

namespace :batch do
  desc "Create a new instance of Day everyday"
  task create_day: :environment do
    Day.create!
  end
end

crontab -l 输出

# Begin Whenever generated tasks for: /Users/myusername/code/myusername/habit-tracker/config/schedule.rb at: 2024-04-30 17:17:19 +0200
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * /bin/bash -l -c 'cd /Users/myusername/code/myusername/habit-tracker && bundle exec rails runner \'\'Day.create!\'\''

# End Whenever generated tasks for: /Users/myusername/code/myusername/habit-tracker/config/schedule.rb at: 2024-04-30 17:17:19 +0200

补充说明

  • 无任何报错信息,每次更新schedule文件后都执行whenever --update-crontab和bundle exec whenever,得到如下输出:
* * * * * /bin/bash -l -c 'cd /Users/myusername/code/myusername/habit-tracker && bundle exec rails runner \'\'Day.create!\'\' >> log/cron_error.log 2>&1'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
  • 使用macOS系统,无法执行sudo service cron status命令,求替代排查方法。

排查与解决步骤

1. 检查macOS上cron服务状态

macOS用launchctl管理服务,替代service cron status的命令:

  • 查看cron是否运行:launchctl list | grep cron,输出中包含com.vix.cron且PID不为0,说明服务正常运行
  • 或者用pgrep cron,有数字输出表示cron进程存在
  • 若未运行,启动cron:sudo launchctl start com.vix.cron

2. 查看cron执行日志

macOS默认cron日志路径为/var/log/cron,实时查看日志:

tail -f /var/log/cron

也可以在定时任务中添加自定义日志输出,修改schedule.rb:

every 3.minute do
  command "cd /Users/myusername/code/myusername/habit-tracker && bundle exec rails runner 'Day.create!' >> log/cron_output.log 2>&1"
end

之后查看log/cron_output.log获取具体执行错误信息。

3. 修复whenever命令转义问题

从crontab输出可见,命令中的引号被错误转义为\'\'Day.create!\'\',导致rails runner执行失败。建议改用whenever内置的runner方法,自动处理引号:

every 3.minute do
  runner 'Day.create!', environment: 'development'
end
set :environment, 'development'

重新更新crontab:

whenever --update-crontab --set environment=development

4. 手动验证任务可行性

直接在终端执行任务命令,排查代码或环境问题:

  • 测试rails runner命令:
cd /Users/myusername/code/myusername/habit-tracker && bundle exec rails runner 'Day.create!'
  • 测试rake任务:
bundle exec rake batch:create_day

若执行失败,会直接输出错误信息,定位问题(比如Day模型验证失败、数据库连接问题等)。

5. 解决cron环境变量缺失问题

cron的环境变量与终端用户环境不同,可能找不到ruby或bundle。先获取完整路径:

which ruby
which bundle

修改schedule.rb中的command,使用完整路径:

every 3.minute do
  command "cd /Users/myusername/code/myusername/habit-tracker && /path/to/bundle exec /path/to/ruby bin/rails runner 'Day.create!' >> log/cron_error.log 2>&1"
end

替换/path/to/bundle和/path/to/ruby为实际输出路径。


内容的提问来源于stack exchange,提问作者Camille H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:34:53