2012-04-10 13 views
1

これは、ServerFaultで尋ねられるべきか、ここでは、Rails 3.2.3アプリケーションのMechanizeとNokogiriに固有のサーバーの問題であるかどうかはわかりません。レイクタスクの機械化は一部のサーバーでは機能しますが、他のサーバーでは機能しません。

Googleのサービスプロバイダのウェブサイトから緯度と経度を掻き取るレーキタスクがあります。

他のタスクとともに「crontab -e」にタスクを設定しました。何らかの理由で、2台のsupposidly identialサーバー上で、1台のサーバは次のエラーでrakeタスクを完了するのに失敗します。

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*\)/ 

両方のサーバーがRailsの3.2.3、Rubyの1.9.2を実行しています。

なぜ私はそれが '未定義(?...)シーケンス'が1つのサーバー上ではなく他のサーバーで失敗するのか理解できません。

両方のサーバがRVMを使用しており、Ubuntu 10.04を実行しています。

次のように完全なrakeタスクは次のとおりです。

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' 

エンド

任意のポインタをいただければ幸いです!

+0

誰かが適切な正規表現について間違っているようです。もしあなたがhtmlを投稿したとします。 – pguardiario

答えて

2

問題は、正規表現や古いルビを使用していることに由来します。

これはRVMを使用すると簡単に発生します。

デフォルトでは、RVMは設定を読み込むだけで、対話型シェルです。 Cronjobsはデフォルトでshシェルを使用します。

RVMには、これを処理するためのシェルラッパーが付属しています。あなたのcronjobの上部にSHELL=/path/to/rvm/bin/rvm-shell(b/c私は助けにサーバにログインしました)を追加してくださいこれのパスは/usr/local/bin/rvm/bin/rvm-shellこれを設定すると正しいrvmパスが含まれます。

次のステップは、cronコマンドを修正することでした。 rvm-shellを使用しているので、あなたのrvmで正しい宝石(レーキなど)を使用するためのパスを削除したい。

rakeへの絶対パスを削除した後、SHELL変数をcrontabの先頭に追加すると、すべてのcronが正しく起動します。

1

このエラーメッセージは、ruby 1.8.7のregex engineによって発生しています。例えばthis questionを参照してください。実際に両方のマシンでRuby 1.9.3を使用している場合、これはうまくいくはずです。

ルビー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 

ルビー1.9.2:

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

ので、ダブルチェック、あなたの障害が発生したサーバー上で右RVMのルビーを使用して、実際にされている場合。あなたは

rvm 1.9.2 --default 

とRVMの実行ファイルは、任意の潜在的にインストールされたシステムのルビーの前にパスにあることを使用して、デフォルトとして1.9.2以上を設定している場合は一つには、確認してください。また、cronジョブはデフォルトではユーザーの環境を利用できないので、明示的に渡すか、ログインシェル内からcronジョブを実行する必要があります(例:http://danielsz.posterous.com/how-to-run-rvm-scripts-as-cron-jobs参照)。

+0

+1正規表現とルビーのバージョンを見つける –

関連する問題