2012-04-10 7 views
1

Ich bin nicht sicher, ob dies auf ServerFault oder hier gefragt werden sollte, da es sich um ein Serverproblem handelt, das spezifisch für Mechanize und Nokogiri in einer Rails 3.2.3 Anwendung ist.Mechanize Rake-Aufgaben funktionieren auf einigen Servern, aber nicht auf anderen?

Ich habe eine Rake-Aufgabe, die ein Breiten- und Längengrad von einer unserer Service-Provider-Websites kratzt.

Ich habe die Aufgabe in "Crontab -e" zusammen mit den anderen Aufgaben eingerichtet. Aus irgendeinem Grund auf zwei supposidly idential Server, einer der die Server nicht die Harke Aufgabe mit dem folgenden Fehler abzuschließen:

X-Cron-Env: <PATH=/usr/bin:/bin> 
X-Cron-Env: <LOGNAME=root> 
Message-Id: <[email protected]> 
Date: Tue, 10 Apr 2012 14:46:30 +0100 (BST) 

rake aborted! 
/var/www/railsapp/lib/tasks/peoplesafelocation.rake:29: undefined (?...) sequence: /new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/ 

Beide Server laufen Rails 3.2.3 Ruby 1.9.2.

Ich kann nicht verstehen, warum es mit 'undefined (? ...) Sequenz' auf einem Server fehlschlagen würde, aber nicht das andere.

Beide Server verwenden RVM und Ubuntu 10.04.

Die vollständige Rake Aufgabe ist wie folgt:

desc "Import Peoplesafe Location" 
task :fetch_peoplesafelocation => :environment do 

# Logs into provider.co.uk/live and retrieved latitude and longitude. 
require 'rubygems' 
require 'mechanize' 
require 'logger' 
require 'nokogiri' 

# Create a new mechanize object 
agent = Mechanize.new 

# Load the Peoplesafe website 
page = agent.get("http://provider.co.uk/live/") 

# Select the first form 
form = agent.page.forms.first 
form.username = 'User' 
form.password = 'Password' 

# Submit the form 
page = form.submit form.buttons.first 

page = agent.get("http://provider.co.uk/live/?gps&cid=AAXA-PJZM6M") 

html_doc = page.root 

script = page.at('/html/head/script[not(@src)]') 
parts = script.text.match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/) 

#puts parts[:lat], parts[:long] 

Location.create(:latitude => parts[:lat], :longitude => parts[:long]) 
puts 'Location Updated' 

Ende

Alle Zeiger würde geschätzt!

+0

Jemand scheint dich falsch über die richtige Regex gelenkt zu haben. Vielleicht, wenn Sie den HTML-Code posten. – pguardiario

Antwort

2

Die Probleme stammen von der Regex und Verwendung und älteren Ruby.

Dies wird leicht durch die Verwendung von RVM verursacht.

Standardmäßig lädt RVM nur seine Konfiguration mit seiner interaktiven Shell. Cronjobs verwenden standardmäßig die Sh-Shell.

RVM wird mit einem Shell Wrapper ausgeliefert, um damit zu helfen. An der Spitze deines Cronjobs addiere SHELL=/path/to/rvm/bin/rvm-shell (b/c ich loggte mich in den Server ein, um zu helfen) Der Pfad von diesem war /usr/local/bin/rvm/bin/rvm-shell Einstellung dieses schließt die korrekten rvm Wege mit ein.

Der nächste Schritt war, die Cron-Befehle zu beheben. Da wir rvm-shell verwenden, möchten wir die Pfade entfernen, um die richtigen Edelsteine ​​(Rake, etc.) mit Ihrem rvm zu verwenden.

Nachdem der absolute Pfad zum Rake entfernt wurde und die Variable 10 oben in der Crontab hinzugefügt wurde, werden alle Crons korrekt ausgelöst.

1

Diese Fehlermeldung wird von ihnen ausgelöst Regex-Engine in Ruby 1.8.7; siehe zum Beispiel this question. Dies sollte funktionieren, wenn Sie Ruby 1.9.3 auf beiden Rechnern verwenden.

Rubin 1.8.7:

$ rvm 1.8.7-p334 
$ irb 
1.8.7 :002 > "foo".match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/) 
SyntaxError: compile error 
(irb):2: undefined (?...) sequence: /new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/ 
from (irb):2 

Rubin 1.9.2:

$ rvm 1.9.2-p290 
$ irb 
1.9.2p290 :001 > "foo".match(/new GLatLng\(\s*(?<lat>.+?)\s*,\s*(?<long>.+?)\s*\)/) 
=> nil 

So überprüfen Sie, wenn Sie in der Tat mit dem rechten rvm Rubin auf dem fehlerhaften Server sind. Für eine Sache, wenn Sie 1.9.2 oder höher als Standard mit

rvm 1.9.2 --default 

und dass die rvm ausführbaren Dateien sind auf dem Weg, bevor ein möglicherweise installierten System rubinfestgelegt haben. Beachten Sie auch, dass Cronjobs standardmäßig nicht über die Benutzerumgebung verfügen. Sie müssen diese explizit übergeben oder den Cron-Job in einer Login-Shell ausführen (siehe zum Beispiel http://danielsz.posterous.com/how-to-run-rvm-scripts-as-cron-jobs).

+0

+1 zum Finden der Regex- und Ruby-Version –