如何让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
相关产品推荐
相关产品推荐

