2012-11-19 14 views
12

Mam skrypt ruby, który łączy się z wiadrem Amazon S3 i pobiera najnowszą kopię zapasową produkcji. Przetestowałem skrypt (który jest bardzo prosty) i działa dobrze.Praca Cron nie może załadować gem

Jednak, gdy zaplanuję uruchomienie tego skryptu jako zadania cron, wydaje się nie działać, gdy ładuje się klejnot Amazon (aws-s3).

Pierwszych kilka wierszy mojego skryptu wygląda następująco:

#!/usr/bin/env ruby 
require 'aws/s3' 

Jak powiedziałem, kiedy uruchomić ten skrypt ręcznie, to działa dobrze. Gdy uruchomię go za pośrednictwem zaplanowanego zadania cron, to się nie powiedzie, gdy próbuje załadować gem:

`require ': Nie ma takiego pliku do załadowania - AWS/s3 (LoadError)

crontab dla tego skryptu wygląda następująco:

0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 

I początkowo pomyślałem, że może to być spowodowane cron działa jako inny użytkownik, ale kiedy zrobić „whoami” na początku mojego skryptu ruby ​​on mówi mi, że to działa jako ten sam użytkownik, z którego zawsze korzystam.

Zrobiłem również init pakietu i dodałem klejnot do mojego gemfile, ale to nie wydaje się mieć żadnego wpływu.

Dlaczego cron nie może załadować klejnotu? Używam Ubuntu.

Odpowiedz

11

Jeśli uruchamiasz go ręcznie i działa, prawdopodobnie znajdujesz się w innym środowisku powłoki niż cron. Odkąd wspomniałeś, że jesteś w Ubuntu, prawdopodobnie zadania crona są wykonywane w katalogu/bin/sh, a ty jesteś ręcznie uruchamiając je w katalogu/bin/bash, jeśli nic nie zmieniłeś.

Można debugować problemy środowiskowe lub zmienić powłokę, pod którą działa zadanie.

Aby debugować, istnieje kilka sposobów, aby dowiedzieć się, jakie powłoki używa twoja praca cron. To może być zdefiniowana w

/etc/crontab 

lub można dokonać crona aby zrzucić swoją skorupę i informacji środowiskowej, jak już wspomniano w tym SO odpowiedzieć: How to simulate the environment cron executes a script with?

Aby przełączyć się do tej skorupy i zobaczyć rzeczywisty błędy powodujące pracę na niepowodzenie zrobić

sudo su 
env -i <path to shell> (e.g. /bin/sh) 

następnie uruchomić skrypt powinieneś zobaczyć jakie są błędy i móc je naprawić (rubygems?).

Opcja 2 służy do przełączania powłok. Zawsze możesz spróbować czegoś takiego:

0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1' 

Aby zmusić swoją pracę do basha. To też może wyjaśnić.

+2

Okazuje się, że muszę zainstalować rubygems w tej powłoce. To pomogło mi go wyśledzić. –

0

poza środowiskiem cron wykonanie echo $PATH skopiuj ścieżkę i wklej go do swojej crontab, przed poleceniem:

echo $PATH 
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 

i wewnątrz crontab:

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 
0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 
4

Możesz także wyraźnie Określ Ścieżka klejnotu:

GEM_HOME="/usr/local/rvm/gems/[email protected]"

+0

Możesz sprawdzić swój klejnot w domu w środowisku innym niż cron: 'echo $ GEM_HOME' – thiagotonon

22

Jak wspomniano tutaj https://coderwall.com/p/vhv8aw można po prostu spróbować

rvm cron setup # let RMV do your cron settings

Upewnij się, że zrobić kopię crontab przed uruchomieniem tej komendy

+1

Ratujesz moje życie, wielkie dzięki. – overallduka

+5

Noice. Po prostu upewnij się, że twoja kopia zapasowa crontab wcześniej, ponieważ usunięte moje. – Peleg

+1

Dziękuję za to, spędziłem 2 godziny płacząc. –

1

Dodaj to na początku cron'a

PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/home/user/.rvm/bin:/usr/local/sbin:/usr/sbin:/home/user/.rvm/bin:/home/user/.local/bin:/home/user/bin" 
GEM_HOME='/home/user/.rvm/gems/ruby-2.1.4' 
GEM_PATH='/home/user/.rvm/gems/ruby-2.1.4:/home/user/.rvm/gems/[email protected]' 
MY_RUBY_HOME='/home/user/.rvm/rubies/ruby-2.1.4' 
IRBRC='/home/user/.rvm/rubies/ruby-2.1.4/.irbrc' 
RUBY_VERSION='ruby-2.1.4' 
Powiązane problemy