解决 gem whenever 没有定期运行的问题

你可能会看到这篇博客的前一篇标题类似,这两篇内容是大体一样的,
只是那一篇是英文,这一篇是中文。

先直接上结论

短结论:

我 Mac 开发机本地跑 spring stop 这一条命令就解决了问题。
Ubuntu 服务器上的请滚动到文章最后一部分。

Mac 本地开发机的长结论:

首先我用 whenever 写好定期任务并且用命令 whenever -w 写入。
2 分钟后没有看到预期的效果。(我定的是2分钟一次)

crontab -e 看到命令的确是对的,于是手动把 crontab 里的命令跑了一下,
其中 rails runner 输入之后命令行直接返回了,很奇怪,
于是我又尝试了一下 rails console,也是直接返回了,什么效果也没有。
但是 rails s 是能跑起来的。
最后根据这个答案里的 spring stop 解决问题:https://stackoverflow.com/questions/25562083/rails-runner-not-working

whenever 是什么?

https://github.com/javan/whenever/
whenever 是个 gem,用这个写定时任务会方便很多。

上面的结论只是为了短,以下多说点情况

今天弄定时任务,需要3小时算一次分。所以需要一个每3个小时跑一次的定时任务。
于是在 Rails 的 model 里写了 2 个方法一个 cal_score 一个 cal_price。

所以 whenever 这边是这样写的:
文件路径: config/schedule.rb

every 2.minute do
  runner "Location.cal_score"
  runner "Location.cal_price"
end

先写 2 分钟测试一下。如果管用了再调整时间就是了。

写完跑了 whenever 看效果。这个命令只是输出转义后的 cronjob 语法,并没有实际修改任何文件,
然后再跑 whenever -w 写入。

按理来说2分钟之后应该生效,因为我在这两个方法的结尾都写了大概10行的代码,给某个 Model 写入新记录,并且有时间的(自带的 created_at 和 updated_at),我就在后台刷新看这个 Model 的记录。

结果没有生效。
我手动看了 crontab -e 里面的命令。rails runner 那个命令我手动跑了不行
rails console 也不行,最后 Stackoverflow 查到 spring stop 解决问题。


上面只是解决了 mac 本地机子的问题

我弄到 Ubuntu 服务器上结果不行,整整花了一个下午才解决。
最后管用的是如下代码:

文件路径 config/schedule.rb

set :path, "/var/www/yuzhu/current"
set :bundle_path, "/usr/local/bin/bundle"
set :rails_path, "/usr/local/bin/rails"
set :output, {:error => "/var/www/random_log/cron_error_log.log", :standard => "/var/www/random_log/cron_log.log"}

job_type :my_rails, 'cd :path && :bundle_path exec :rails_path runner -e production :task :output'

every 3.hours do
  my_rails "Location.cal_score"
  my_rails "Location.cal_price"
end

你可以看到我定的是 3.hours, 你可以先定 1.minute 来测试。测好了再把时间拉长。

全文完