質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1854閲覧

wheneverでタスク手動実行に失敗する。

koichi8888

総合スコア24

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/05/29 04:21

編集2018/05/29 04:36

前提・実現したいこと

railsアプリケーションでwheneverで日時タスクを実行したいです。
コントローラのメソッドを追記し、そのメソッドを実行する、
もしくはタスクファイルをlib/tasks/直下に作成し、クラス、メソッドを作成し、それを実行する形で実装したいと思っております。

動作確認として、タスクを手動実行したところ、エラーが表示され、エラー内容としてはクラスがうまく読み込めていない旨のメッセージが表示されているのですが、つづりは合っており、対応に困っています。
何かご存知のことがございましたら、ご教示頂けると助かります。

発生している問題・エラーメッセージ

[root@localhost Myapp]# bundle exec rails runner items_controller.mail_notice Running via Spring preloader in process 3927 /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/runner.rb:62:in `<top (required)>': undefined local variable or method `items_controller' for main:Object (NameError) from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/runner.rb:62:in `eval' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/runner.rb:62:in `<top (required)>' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:274:in `require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:274:in `block in require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:240:in `load_dependency' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:274:in `require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:123:in `require_command!' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:90:in `runner' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:39:in `run_command!' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands.rb:17:in `<top (required)>' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:274:in `require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:274:in `block in require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:240:in `load_dependency' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:274:in `require' from /Myapp/bin/rails:9:in `<top (required)>' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:268:in `load' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:268:in `block in load' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:240:in `load_dependency' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activesupport-4.2.10/lib/active_support/dependencies.rb:268:in `load' from /usr/local/rbenv/versions/2.3.7/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:59:in `require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:59:in `require' from -e:1:in `<main>' [root@localhost Myapp]# bundle exec rails runner Tasks::Mailnotice.execute Running via Spring preloader in process 4174 /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/runner.rb:62:in `<top (required)>': uninitialized constant Tasks::Mailnotice (NameError) from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/runner.rb:62:in `eval' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/runner.rb:62:in `<top (required)>' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:123:in `require_command!' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:90:in `runner' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:39:in `run_command!' from /usr/local/rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/railties-4.2.10/lib/rails/commands.rb:17:in `<top (required)>' from /Myapp/bin/rails:9:in `<top (required)>' from /usr/local/rbenv/versions/2.3.7/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:59:in `require' from /usr/local/rbenv/versions/2.3.7/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:59:in `require' from -e:1:in `<main>'

該当のソースコード

/config/schedule.rb

Ruby

1# Use this file to easily define all of your cron jobs. 2# 3# It's helpful, but not entirely necessary to understand cron before proceeding. 4# http://en.wikipedia.org/wiki/Cron 5 6# Example: 7# 8# set :output, "/path/to/my/cron_log.log" 9# 10# every 2.hours do 11# command "/usr/bin/some_great_command" 12# runner "MyModel.some_method" 13# rake "some:great:rake:task" 14# end 15# 16# every 4.days do 17# runner "AnotherModel.prune_old_records" 18# end 19 20# Learn more: http://github.com/javan/whenever 21 22# ログ出力先ファイルを指定 23 set :output, 'log/crontab.log' 24# ジョブ実行環境を指定 25# set :environment, :production 26# set :environment, :production 27 28 29# [例] 1分に1回 30 every 1.minute do 31 32 # bash コマンドの実行例 33 command "echo 'hello, whenever world!'" 34 35 # コントローラのメソッドを呼び出し 36 runner "items_controller.mail_notice" 37 38 # タスクを呼び出し 39 runner "Tasks::Mailnotice.execute" 40end 41 42 43

/lib/mail_notice.rb

Ruby

1class Tasks::mail_notice 2 def self.execute 3 SampleMailer.send_when_limit.deliver 4 end 5end

更新、動作確認の出力

Ruby

1[root@localhost Myapp]# bundle exec whenever --update-crontab 2[write] crontab file updated 3[root@localhost Myapp]# crontab -l 4# Begin Whenever generated tasks for: /Myapp/config/schedule.rb at: 2018-05-29 13:25:56 +0900 5* * * * * /bin/bash -l -c 'echo '\''hello, whenever world!'\'' >> log/crontab.log 2>&1' 6 7* * * * * /bin/bash -l -c 'cd /Myapp && bundle exec bin/rails runner -e production '\''items_controller.mail_notice'\'' >> log/crontab.log 2>&1' 8 9* * * * * /bin/bash -l -c 'cd /Myapp && bundle exec bin/rails runner -e production '\''Tasks::Mailnotice.execute'\'' >> log/crontab.log 2>&1' 10 11# End Whenever generated tasks for: /Myapp/config/schedule.rb at: 2018-05-29 13:25:56 +0900

app/controllers/items_controller.rb

Ruby

1class ItemsController < ApplicationController 2 3 before_action :authenticate_user 4 5 6 def index 7 8 9 # データを降順で表示する 10 @items = GyomuDatum.all.order(created_at: 'desc') 11 12 13 # 期限が迫っているデータを検索する 14 15 # 1ヶ月前 16 from = Time.now.at_beginning_of_day 17 to = (from + 1.month) 18 @items_1month = GyomuDatum.where(end_date: from...to) 19 20 21 22 end 23 24 def show 25 end 26 27 def new 28 @item = GyomuDatum.new 29 end 30 31 def create 32 # render plain: params[:GyomuDatum].inspect 33 # save 34 # @item = Item.new(params[:GyomuDatum]) 35 # @item = GyomuDatum.new(params.require(:GyomuDatum).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment)) 36 @item = GyomuDatum.new(item_params) 37 # @item.save 38 # redirect 39 # redirect_to items_path 40 41 if @item.save 42 # redirect 43 redirect_to items_path 44 else 45 # render plain: @item.errors.inspect 46 render 'new' 47 end 48 end 49 50 51 def edit 52 @item = GyomuDatum.find(params[:id]) 53 end 54 55 def update 56 @item = GyomuDatum.find(params[:id]) 57# pp @item 58# pp item_params 59 60 if @item.update(item_params) 61 redirect_to items_path 62 else 63 render 'edit' 64 end 65 end 66 67 def destroy 68 @item = GyomuDatum.find(params[:id]) 69 @item.destroy 70 redirect_to items_path 71 end 72 73 74 75# cron用メール送信メソッド 76 def mail_notice 77 78 # メール送信実行 79 SampleMailer.send_when_limit.deliver 80 81 end 82 83 84 private 85 def item_params 86 permits = [ 87 :manage_id, 88 :category_id, 89 :publish_corporation, 90 :ip_address, 91 :target_server, 92 :start_date, 93 :end_date, 94 :comment 95 ] 96 params.require(:gyomu_datum).permit(permits) 97 end 98 99 100end

試したこと

補足情報(FW/ツールのバージョンなど)

【環境情報】
・Apache
Server version: Apache/2.4.6 (CentOS)

・Rails
Rails 4.2.10

・OSバージョン
CentOS Linux release 7.4.1708 (Core)

・Mysql
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper

・Ruby
ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しましたので、下記に記載します。

原因としてはwheneverはデフォルトでproductionで動作する仕様のため、アプリの動作環境であるdevelopmentで動作するようにschedule.rbで明示的に指定する必要がありました。

crontab -lで動作確認をした際にproductionで動作していることが表示されているので、そこで気づければ、良かったのですが。

/config/schedule.rb

Ruby

1# ジョブ実行環境を指定 2# set :environment, :production 3set :environment, :development

投稿2018/05/31 04:26

koichi8888

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問