2009-06-05 14 views
2

Ich habe eine Rake-Datei, die erfolgreich an der Befehlszeile ausgeführt werden kann. Wenn ich einen Cronjob zum Ausführen dieser Rake-Datei einstelle, schlägt die Zeile "require 'json'" fehl. Meine Vermutung ist, dass Cronjob eine andere env-Variable hat. Es funktioniert nicht, wenn ich "puts ENV" in das Ruby-Skript schreiben wollte. Ich frage mich also, was ich tun sollte, um die verschiedenen env-Variablen zu überprüfen und das Problem zu lösen. Vielen Dank.Rake nicht richtig in Cronjob

+0

verwenden Sie RVM? – cbrulak

Antwort

0

tun Sie

require 'rubygems' 

in Ihrem Skript haben? Z.B. irb lädt Rubygems standardmäßig, während normal Ausführung erfordert explizite Import.

+0

Ja, ich habe 'Rubygems' verlangt. Wenn ich auf der Kommandozeile rake, Rake date.rake, kein Problem. Fehler tritt nur bei Cronjob auf. – swingfuture

0

Erstens: require "json" ist wahrscheinlich fehlgeschlagen, weil Rubygems nicht geladen ist. Sie können das wahrscheinlich beheben, indem Sie entweder require 'rubygems' oben platzieren oder RUBYOPT=rubygems an der Vorderseite der Befehlszeile des Cron-Auftrags oder an der Umgebung von Cron hinzufügen (Sie können normalerweise Umgebungsvariablen in der Crontab festlegen).

Um Ihre ENV Debugging-Problem zu beantworten: ist es möglich, dass nicht funktioniert, weil Stdout irgendwo umgeleitet wird, wissen Sie nicht während des Cron-Job (es kann sicherlich nicht zu Ihrem Terminal gehen)? Sie könnten der folgenden stattdessen versuchen:

File.open('/tmp/debug_env', 'w') do |f| 
    f.puts ENV.to_hash.inspect 
end 

Und dann einen Blick in /tmp/debug_env nehmen, um zu sehen, was da ist. Umgebungsvariablen, auf die besonders geachtet werden muss, sind $USER, $GEM_HOME, $GEM_PATH, $RUBYOPT.

+0

Zuerst habe ich Rubygems geladen, zweitens habe ich versucht, Ihren Rat hinzufügen RUBYOPT = Rubygems an der Vorderseite von Cronjob, der gleiche Fehler. Ich werde das ENV-Debugging versuchen. – swingfuture

3

Es könnte sein, wie Sie es in Cron aufrufen. Hier ist, was für mich funktioniert:

cd /full/path/to/rails_root && /full/path/to/rake RAILS_ENV=production my:task 
0

Eine andere Art und Weise, es zu tun: Schreiben Sie ein Wrapper-Skript von cron ausführen: erste Zeile - laden Sie Ihre .profile (oder .bash_profile etc.) zweite Zeile - führen Sie Ihre Rake-Skript