ITエンジニアによるITエンジニアのためのブログ

Heroku Schedulerで曜日指定する方法

herokuではcronがありませんが、その代わりにHeroku Schedulerという無料のスケジューラーアドオンを使用できます。但しHeroku Schedulerは、一般的なcronとは異なり曜日指定ができないという特徴があります。しかし、シェルコマンドや実行スクリプト内で曜日判定を行うことで、この制限を回避できます。本記事では、その具体的な方法を2つ紹介します。

前提として、上記いずれの方法もheroku dynoのタイムゾーン設定に依存しますので、以下のように適切な値に設定しておきます。

heroku config:set TZ="Asia/Tokyo"

1. 実行スクリプト外で曜日判定

実行スクリプトの前にシェルコマンドを追加し、曜日判定を行う方法です。例えば、月曜日にのみ実行したいスクリプトがある場合、以下のように記述します。

[ $(date +%w) -eq 1 ] && bundle exec rake some_task
  • date +%w: 今日の曜日を0(日曜)から6(土曜)までの数値で取得します。
  • -eq 1: 取得した数値が1(月曜日)と等しい場合に、&&の後のスクリプトが実行されます。

この方法では、実行スクリプトが実行されたログが残っていれば、そのスクリプトが実行された曜日が分かります。

実行スクリプト内で曜日判定

実行スクリプト内にRubyのTimeクラスを用いて曜日判定を行う方法です。例えば、Railsアプリケーションで月曜日にバッチジョブを実行したい場合、以下のようなrakeタスクを作成します。

namespace :example do
  desc "Create a CSV file for a given date."
  task :create_csv, [:date] => :environment do |_, args|
    if Time.now.wday == 1
      Rails.logger.info("月曜日です。バッチジョブを実行します。")
      # 
    else
      Rails.logger.info("月曜日以外です。")
    end
  end
end

この方法では、スクリプト実行時に曜日判定を行い、結果をログに出力します。これにより、バッチジョブが実行されたかどうかをログから確認できます。

まとめ

Heroku Schedulerの曜日指定の制限は、シェルコマンドや実行スクリプト内の曜日判定で克服できます。どちらの方法も状況に応じて使い分けることで、柔軟なスケジューリングを実現できます。