【Rails】定期実行をしてみよう!(whenever, cron)

Ruby on Rails

はじめに

この記事の概要

こんにちは、Rubyをメインで書いている株式会社TOKOSのツキヤです!
今回は、Railsで定期実行をする方法を2つ紹介しようと思います。
定期実行とは、読んで字のごとくプログラムを定期的に自動で実行することです。

定期実行ができるようになることで、
・期間限定のアイテムを30日後に自動削除
・月の初めにユーザーにメールを一斉送信
などなど、なくてはならない機能からできたら嬉しいことまで様々なことができるようになります!
この記事を定期実行のとっかかりにしていただければ何よりです🥺
なお今回は、定期実行の実装方法を2パターン説明します!

対象読者

  • 定期実行をしたことがない初学者

筆者の環境

技術等バージョン
実行環境Ubuntu(dockerのコンテナ)
ruby2.7.4
rails6.1.4

実装方法

wheneverを使用した場合

まずはネットで検索した際に良く出てくるwheneverというgemを使用した定期実行の方法を説明します。

とりあえず、前提として定期実行したい処理をrakeタスクとして作成しておきます。
rakeタスクについては、前回の記事で説明したので詳しくはそちらを読んでください🙇‍♂️
Ruby on Rails【Rails】rakeタスクとは? 概要から使い方までを解説!

次に、wheneverをインストールします。

# 中略
gem "whenever"
$ bundle install

いつもの手順でgemをインストールしましょう!

そして、

$ bundle exec wheneverize .

上記コマンドを打つことで、config/schedule.rbが作成されます。
この中に、定期実行したい処理や間隔を追記していきます。

every 1.minutes do
  rake "sample_task:taro_create"
end 

今回は、「1分おきにname: taroのUserがcreateしてください」という命令になります。
(これは実際のアプリだとすると全く意味が無い定期実行なので、適宜コードを記述してください😨)

最後にターミナルでこのファイルの設定を読み込ませます。

$ bundle exec whenever --update-crontab

これで定期実行の設定が完了しました🥳
あとは処理が行われているか確認してみてください!

また、定期実行を取り消したい時は

$ bundle exec whenever --clear-crontab

上記コマンドで定期実行を停止することができます。

以上がwheneverを用いた定期実行の説明でした!
環境変数やログファイル等の調整は、公式のgithubに載っているので細かく制御したい人は見てみてください🙇‍♂️
参考 whenverGitHub

cronを使用した場合

次にcronという、linuxに元々入っている機能を使って定期実行を実装します。
先程のwheneverも実際のところ、内部的にcronを使用して実装をしています。
なので、それならgemを使わずに直接cronを操作しちゃっても問題無いということですね😎
なんなら、依存するgemを減らせるのでサーバーをある程度触れる人はこちらの実装の方が良いと思います💪

MEMO
wheneverの方で実装すると、ファイル内に記述した内容がドキュメントとしての役割を果たしてくれ、チーム開発の際に生産性が上がる可能性があります。
$ crontab -e

上記コマンドを打つと、ターミナル上でコードエディタが立ち上がります。

ツキヤ
ツキヤ

コードエディタはデフォルトだとVimが立ち上がるので、Vimの操作方法が分からない人は調べてみてね!


下記のように編集してください。

0 * * * * cd /プロジェクトの絶対パス && rake sample_task:taro_create 

0 * * * *の部分で定期実行する間隔を決めています。
今回の場合だと、毎時0分に実行という命令になります。(1時間おき)
細かい設定方法を知りたい方は、下記サイトが参考になります。
参考 crontabの色々な設定方法(毎日、毎時、1日1回など)

間隔を決めた後に、打ちたいコマンドを記述するだけで設定完了になります。
エディタをセーブしたタイミングで勝手にサーバーが読み込んでくれるので、特に行う作業は有りません。

要らなくなった際は、再度$ crontab -eでエディタを立ち上げ、該当する行を削除してください!

以上がcronを用いた定期実行の説明でした!
こっちも結構簡単ですね!
僕は基本はこちらの方法で実装しています😎

注意
今回の前提のOSがLinuxになっています。MacやWindowsの場合はcronのインストールからはじめる必要があるかもしれないので、ご注意ください🙇‍♂️

終わりに

今回は、定期実行の行い方を2パターン説明しました。
どちらもメリットデメリットはありますので、自身の要望と検討した上で適切な方を使用できると良いですね!

Railsの勉強をしたい方はこの本が参考になるかと思いますので興味がある方は是非読んで見て下さい🙇‍♂️