0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails × SQLite × Whenever】cronでRakeタスクが動かないときの完全対応メモ(macOS対応)

Posted at

はじめに

Railsで「毎日ユーザーのポイントをリセットする」処理を rake + whenever + cron で実装しようとしたところ、macOS + SQLite環境で思いがけないハマりポイントがいくつもありました。

この記事では、実際に遭遇したエラーとその解決策を、順を追って整理しています。


やりたいこと

  • 全ユーザーの points を毎日 15 にリセットしたい
  • SQLite を使っている開発環境(Mac)
  • rake タスクを whenever で定期実行

手順とコード構成

1. Rakeタスクの作成

# lib/tasks/reset_points.rake

namespace :user do
  desc "全ユーザーのポイントを15にリセットする"
  task reset_points: :environment do
    User.update_all(points: 15)
    puts "[#{Time.now}] ポイントをリセットしました"
  end
end

2. config/schedule.rb の設定

# config/schedule.rb

set :output, "log/cron.log"
set :environment, "development"
env :PATH, ENV['PATH']

# zshログインシェル & プロジェクトディレクトリへ移動
set :job_template, "/bin/zsh -l -c 'cd /Users/jadikad/Development/backend && :job'"

# テスト用:毎分実行(本番では daily に)
every 1.minute do
  rake "user:reset_points"
end

whenever --update-crontab を実行して反映するのを忘れずに!


よくあるエラーとその解決法

❌ エラー1: bundler が見つからない

Could not find 'bundler' (2.3.27) required by your Gemfile.lock.

原因
cron は .zshrc.bash_profile を読み込まないため、rbenv などの Ruby 環境が初期化されない。結果として、macOS のデフォルト Ruby(2.6など)が使われる。

解決策
schedule.rb に以下を追加:

set :job_template, "/bin/zsh -l -c ':job'"

❌ エラー2: No database file specified

ArgumentError: No database file specified. Missing argument: database

原因

  • RAILS_ENV が正しく指定されていない
  • SQLite の .sqlite3 ファイルが db/ ではなく storage/ にある

解決策

  1. schedule.rb に以下を追加:
set :environment, "development"
  1. config/database.yml のパスを修正:
development:
  adapter: sqlite3
  database: storage/development.sqlite3

❌ エラー3: cronが正しいディレクトリで実行されない

原因
cron はプロジェクトのルートディレクトリでコマンドを実行しないため、相対パスの rakerails コマンドが失敗する。

解決策
schedule.rbcd を明示:

set :job_template, "/bin/zsh -l -c 'cd /Users/jadikad/Development/backend && :job'"

✅ 最終的な schedule.rb

set :output, "log/cron.log"
set :environment, "development"
env :PATH, ENV['PATH']
set :job_template, "/bin/zsh -l -c 'cd /Users/jadikad/Development/backend && :job'"

every 1.minute do
  rake "user:reset_points"
end

🧪 動作確認方法

# cronに反映
$ whenever --update-crontab

# ログをリアルタイムで確認
$ tail -f log/cron.log
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?