2012-03-23 14 views
21

Mam aplikację Rails wdrożoną na Heroku z dodatkiem programu planującego Heroku z powodzeniem pracując dla codziennych zadań.Jak mogę zaplanować pracę "tygodniową" na Heroku?

Teraz chcę wykonać tygodniową pracę , ale dodatek do harmonogramu nie pozwala mi na cotygodniową opcję.

Wszelkie sugestie, w jaki sposób mogę to osiągnąć:

  • Próbowałem za pomocą rufus-scheduler w przeszłości, ale to sprawiało mi pewne problemy, więc nie jest to opcja. Aby uzyskać szczegółowe informacje, patrz: here.
  • Zastanawiam się nad czymś w rodzaju sprawdzania bieżącego dnia w codziennej pracy. Czy ktoś próbował go i ma informacje zwrotne lub zna problemy z podejściem?
  • Inne pomysły bardzo doceniane.

Odpowiedz

35

Jedno podejście byłoby jednym z Twojego 2nd podpunkcie:

aktywować Heroku cron dodatek i dodać cron.rake zadanie app/lib/tasks

Aktywuj Heroku scheduler add-on i dodać scheduler.rake zadanie app/lib/tasks

task :your_weekly_task=> :environment do 
    if Time.now.friday? # previous answer: Date.today.wday == 5 
    #do something 
    end 
end 

nawet mieć luksus zdefiniowaniu dni chcesz, r zadanie do uruchomienia; o) (5 jest na piątek)

EDYCJA: przy okazji, Cron jest przestarzały i Heroku zaleca przejście na ich dodatek do harmonogramu. Nie zmienia to jednak podejścia do cotygodniowej pracy.

EDIT2: korekty mojej odpowiedzi na podstawie opinii z Sunkencity.

+3

Dodatek cron jest przestarzały i zostanie wycofany na korzyść programu planującego. Powiedział, że podejście, które sugerujesz, jest dobre, ale można je lepiej sformułować dzięki activesupport: Time.now.friday? – sunkencity

+0

Kręcę się na myśl o zakodowaniu tego dnia, więc zostawię pytanie otwarte na teraz, by znaleźć lepszą alternatywę. –

+0

Btw, używam konfiguracji heroku config var na dzień tygodnia. Następnie musisz kontrolować porę dnia za pośrednictwem interfejsu użytkownika. To naprawdę * nie * świetne. Zespół Heroku, jeśli tam jesteś i przeczytaj to, popraw program planujący. Nie musi mieć całej elastyczności crona. Ale przynajmniej spraw, aby można było planować cotygodniowe i miesięczne oferty pracy. –

8

Nie jest to idealne rozwiązanie, ale dodałem zmienną środowiskową RUN_IF, aby pobierać zadania uruchamiane przez Heroku: harmonogram, który pozwala mi tworzyć tygodniowe i miesięczne harmonogramy zadań.

# lib/tasks/scheduler.rake 
def run? 
    eval ENV.fetch('RUN_IF', 'true') 
end 

def scheduled 
    if run? 
    yield 
    else 
    puts "RUN_IF #{ENV['RUN_IF'].inspect} eval'd to false: aborting job." 
    end 
end 

# lib/tasks/job.rake 
task :job do 
    scheduled do 
    # ... 
    end 
end 

Jeśli zadanie prowizji jest uruchamiane bez zmiennej RUN_IF, to uruchomi się. W przeciwnym razie zadanie zostanie przerwane, o ile wartość RUN_IF nie osiągnie wartości falsey.

$ rake job        # => runs always 
$ rake job RUN_IF='Date.today.monday?' # => only runs on Mondays 
$ rake job RUN_IF='Date.today.day == 1' # => only runs on the 1st of the month 
$ rake job RUN_IF='false'    # => never runs (not practical, just demonstration) 

Podobny do innych pomysłów powyżej, ale wolę przesuwać szczegóły harmonogramu z kodu aplikacji.

+0

Świetne rozwiązanie! – bnussey

0

Jeśli nie chcesz lub nie możesz tego zrobić z prowizji, innym rozwiązaniem jest to zrobić z Ruby z bash:

#!/bin/bash 

cmd="echo your schedule job here" 

# Only run on even days 
ruby -e 'if Time.now.utc.day.even?; puts "Not today!"; exit 1; end' && $cmd "[email protected]" 

To działa nawet w przypadku projektów non-rubinowe (jak w moim przypadku: Clojure).

9

Alternatywna opcja z użyciem tylko kodu powłoki.Konfiguracja harmonogramu Heroku godzinowa i zrobić porównanie przed poleceniem date:

# setting the schedular to run hourly at *:30 is equivalent to the 
# crondate: 30 8 * * 1 
if [ "$(date +%H)" = 08 ] && [ "$(date +%d)" = 01 ]; then YOUR_COMMAND ; fi 

używałem tego kodu, aby naśladować crona w mojej lokalnej strefy czasowej:

nz_hour="$(TZ=NZ date +%H)" ; nz_day="$(TZ=NZ date +%d)" ; if [ "$nz_hour" = 08 ] && [ "$nz_day" = 01 ]; then YOUR_COMMAND ; fi 
1

W omawianym over here i używając powyższa logika Roba, tutaj są skrypty bash z podziałem na dzień tygodnia, raz w miesiącu i na konkretną datę.

Uruchom zadanie w każdy Poniedziałek:

if [ "$(date +%u)" = 1 ]; then MY_COMMAND; fi 

Uruchom zadanie co 1 dzień w miesiącu:

if [ "$(date +%d)" = 01 ]; then MY_COMMAND; fi 

Można również uruchomić zadanie co roku w dniu 24 grudnia:

if [ "$(date +%m)" = 12 ] && [ "$(date +%d)" = 24 ]; then MY_COMMAND; fi 
Powiązane problemy