Help us understand the problem. What is going on with this article?

Railsでwheneverを使って定期実行を実装してみる

More than 1 year has passed since last update.

初めに

railsで定期てきに何かを実行するというのを実装してみる。

自分はWSLを使ってubuntuで行ったが少しつまづいたりしたので最初の設定とかについても書いていく。

まずcronを使えるようにする。

cronはlinux上で定期実行を実現するために必要なもの(よくわかってない…)

wslのubuntu上では最初はcronは起動していない状態だと思う。

とりあえず今の状況を確認するには

service cron status

で確認できる

cronを起動したい場合は

sudo service cron start

止めたい場合は

sudo service cron stop

でOK

cronが実際に動いているか確認するためにはログを見る

ログの場所は

/var/log/cron.log

だが最初はこのファイルがなくまたcronのログを記録してくれない。

なので

/etc/rsyslog.d/50-default.conf

このファイルを編集します

sudo nano /etc/rsyslog.d/50-default.conf

をして

#cron.* /var/log/cron.log

とコメントアウトされているところの#を削除する。

これで最初の設定はOK

ログを出力したい場合は

tail /var/log/cron.log

でみれる。

ログに関していまいちわからないが 2>>となっているところは何かしらのエラーのログを書いてるとおもわれる

cronの使い方

crontab -e

でcronの設定を行える

具体的な設定方法については

クーロン(cron)をさわってみるお
https://qiita.com/katsukii/items/d5f90a6e4592d1414f99

を参考に…

wheneverをつかう

wheneverはrailsでcronを使って定期実行を行う際に使うgem

とりあえず

gem 'whenever'

bundle installをする

そのあと

bundle exec wheneverize

これで/config/schedule.rbというファイルが作成されるのでここに定期実行したいことを書いていく

schedule.rbのかきかた

いまいちよくわかっていないが

とりあえず

set :environment, "development"
set :output, { :error => "log/cron_error.log" }
set :path, "appへのpath"

をかいておく

log/cron_error.logについてはファイルの作成は自動では行ってくれないのでファイルは自分で作る必要がある

appへのpathについては自分の作っているappのディレクトリでpwdと打てば出てくる

そのあとに何時間ごとに何をするかを書いていく

書き方は

every 1.minutes do 
end 
=>一分ごとに行う

every 1.hours do 
end 
=> 一時間ごとに行う

every 1.day, :at => '7:00' do
end
=> 毎日朝の7時に行う

といった感じ

1秒ごとは出来ないっぽい

処理の書き方は

runner "railsでの処理"
command "bashコマンドを行う"

といった感じ

基本的にrunnerを使うことになるのかな?

毎分userをつくる

例えばuserモデルがあったとして毎分userを作りたいとしたら

every 1.minutes do 
  runner 'User.create(name: "taro")
end

みたいにしたら毎分userが作れる。

変更の反映

schedule.rbを変更しただけでは変更は反映されないので

whenever --update-crontab

を行って変更の反映を行う

wheneverでジョブの実行を行う

wheneverでジョブの実行を行いたい場合は

config/application.rbに

    config.autoload_paths += Dir["#{config.root}/lib/**/"]
    config.eager_load_paths += Dir["#{config.root}/lib/**/"]

これを書く

そしてlib以下に
usertask.rbというファイルを作り

usertask.rb
require 'faker'
require "#{Rails.root}/app/models/user"

class Tasks::Usertask
  def self.create
      User.create(name: Faker::Name.first_name)
  end 
end

と書く

schedule.rbに

schedule.rb
every 1.minutes do 
    runner 'Tasks::Usertask.create'
end 

みたいに書けばランダムな名前のユーザーが毎分作られるようになる。

ちなみに

いちおううまくいっているがlog/cron_error.logに

/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21328
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21420
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21512
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21604
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21736
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21828
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21920

みたいにエラーがすごいでる。

なんか権限関係の警告みたい…

終わり

とりあえず定期実行は実装できるようになった。
最初のcronの設定で少しつまづいたけどそれさえ乗り越えたらすごく簡単だった:sunny:

おわり。

参考文献

Wheneverを使ってRailsタスクを定期実行する
http://marimomemo.hatenablog.jp/entry/2017/06/25/200415

[ubuntu] cronのログが出力されない時の対処方法
http://blue-bear.jp/kb/ubuntu-cron%E3%81%AE%E3%83%AD%E3%82%B0%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/

sibakenY
大学卒業後Ruby, Ruby on Railsを勉強しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away