Whenever gem - problem

Hej, witam ma problem z zapisaniem stworzonych jobow w pliku konfiguracyjnym config/scheduler.rb. Gdy uruchamiam komende: whenever -w z poziomu aplikacji rails, pojawia mi sie nastepujacy komunikat:

config/schedule.rb:2:in `block in initialize': uninitialized constant Whenever::JobList::Script (NameError)
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever/job_list.rb:44:in `every'
from config/schedule.rb:1:in `initialize'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever/job_list.rb:25:in `instance_eval'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever/job_list.rb:25:in `initialize'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever.rb:15:in `new'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever.rb:15:in `cron'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever/command_line.rb:55:in `whenever_cron'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever/command_line.rb:38:in `run'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/lib/whenever/command_line.rb:7:in `execute'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/whenever-0.9.0/bin/whenever:41:in `<top (required)>'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/bin/whenever:23:in `load'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/bin/whenever:23:in `<main>'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/bin/ruby_noexec_wrapper:14:in `eval'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/bin/ruby_noexec_wrapper:14:in `<main>'

W 2 drugiej lini pliku config/scheduler.rb mam:

every 1.minute do 
  scripts = Script.find_by_frequency_and_hour(:daily, 18)
  runner ReportMaintenance.process(scripts)
end

Script to klasa modelu.

Wyglada ze wszystko ma byc w cudzyslowach w pliku scheduler.rb

OK, teraz mam inny problem. Job zdefiniowany w crontabie sie nie wykonuje. Sprawdzalem w logach crontaba i komenda jest uruchamiania:

Feb  3 11:30:01 LT0009 CRON[11168]: (lukasz) CMD (/bin/bash -l -c 'cd /home/lukasz/Projects/scritps/QAS_2014_01_30/qas && script/rails runner -e development '\''ReportMaintenance.process(Script.find_by_frequency_and_hour(:daily, 11))'\''')

Ale niestety nie otrzymuje emaila ze skryptem a jak recznie uruchamiam polecenie z konsoli to pojawia mi sie nastepujacy blad:

/home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/railties-3.2.13/lib/rails/commands/runner.rb:53:in `eval': uninitialized constant ReportMaintenance (NameError)
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/railties-3.2.13/lib/rails/commands/runner.rb:53:in `eval'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/railties-3.2.13/lib/rails/commands/runner.rb:53:in `<top (required)>'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/railties-3.2.13/lib/rails/commands.rb:64:in `require'
from /home/lukasz/.rvm/gems/ruby-2.0.0-p247@sp_qas/gems/railties-3.2.13/lib/rails/commands.rb:64:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

W pliku scheduler.rb probowalem umiescic plik report_maintenance.rb ale nie da sie zapisac jobs do crontaba poniewaz:

$ whenever -w --set ‘environment=development’

config/schedule.rb:1:in `require': cannot load such file -- report_maintenance.rb (LoadError)

Może po kolei, bo widzę, że zanim sprawdzisz piszesz posta. Gdzie umieściłeś ten plik report_maintenance.rb bo wiedać, że poprostu nie wczytuje tego pliku, spróbuj załadować plik z prefixem bundle exec , może to pomoże

plik report_maintenance.rb jest w folderze /lib aplikacji

Niestety nie moge tego odpalic, widze ze crontab uruchamia joby ale nie widze efektow. Czy to znaczy ze nie moge uruchamiac za pomoca whenever gem metod klas z folderu lib?

pliki z lib nie są automatycznie ładowane, i trzeba je ręcznie załadowanie (require), nie wiem jak to wyglada w przypadku whenever, ja bym na twoim miejscu przerzucił to do app/services

dzieki wielkie Wafcio, odkomentowalem linie w application.rb:

config.autoload_paths += %W(#{config.root}/lib)

i dziala :slight_smile:

To jest rozwiązanie na szybkiego, ale jest strasznie powolne przy rozbudowanych projektach, bowiem wszystko za każdym razem wczytuje z liba, jeżli masz tam dużo plików to bedziesz miał wolne uruchomienie, dlatego lepiej ręcznie wywołać

require 'report_maintenance.rb'

tylko w tych miejscach, gdzie naprawdę potrzebujesz tego pliku

ale pozostawiajac linijke odkomentowana w application.rb config.autoload_paths += %W(#{config.root}/lib) ?

odkomentowana linijka w application.rb powowuje, że zostaje wykonany require dla wszystkich plików jakie się tam znajdują, więc w application.rb zostawiłbym tą linijke zakomentowaną