1

これは、Rails 3.2.3 アプリケーションの Mechanize と Nokogiri に固有のサーバーの問題であるため、ServerFault またはここで質問する必要があるかどうかはわかりません。

サービス プロバイダーの Web サイトの 1 つから緯度と経度を取得するレーキ タスクがあります。

他のタスクと一緒に「crontab -e」でタスクを設定しました。何らかの理由で、2 つのおそらく同一のサーバーで、1 つのサーバーが次のエラーで rake タスクを完了できません。

X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Message-Id: <20120410134631.2CFA624B76@localhost>
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 を実行しています。

あるサーバーでは「未定義 (?...) シーケンス」で失敗するのに、他のサーバーでは失敗しない理由がわかりません。

どちらのサーバーも RVM を使用しており、Ubuntu 10.04 を実行しています。

完全なレーキ タスクは次のとおりです。

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'

終わり

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

4

2 に答える 2

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 で正しい gem (rake など) を使用する必要があります。

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

于 2012-04-10T17:54:01.060 に答える
1

このエラー メッセージは、ruby 1.8.7 の正規表現エンジンによって発生します。たとえば、この質問を参照してください。したがって、実際に両方のマシンで 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 ruby​​ を使用しているかどうかを再確認してください。1 つには、次を使用して 1.9.2 以降をデフォルトとして設定しているかどうかを確認します。

rvm 1.9.2 --default

また、rvm 実行可能ファイルが、インストールされている可能性のあるシステム Ruby の前のパスにあることを確認します。また、デフォルトでは cron ジョブはユーザーの環境を利用できないことに注意してください。明示的に渡すか、ログイン シェル内から cron ジョブを実行する必要があります (たとえば、http: //danielsz.posterous.com/how-to- を参照)。 run-rvm-scripts-as-cron-jobs )。

于 2012-04-10T14:30:11.843 に答える