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

#初めに
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に

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

これを書く

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

```ruby: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に

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

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


#ちなみに

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

```ruby
/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/