2012-04-10 124 views
1

我不确定这是在ServerFault上还是在这里,因为它是在Rails 3.2.3应用程序中特定于Mechanize和Nokogiri的服务器问题。机械化rake任务适用于某些服务器,但不适用于其他服务器?

我有一个rake任务,可以从我们的服务提供商网站中删除纬度和经度。

我已经将任务设置在'crontab -e'以及其他任务中。出于某种原因,在两个supposidly idential服务器,一个服务器失败,出现以下错误,完成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,1.9.2红宝石。

我不明白为什么在一台服务器上会出现'未定义(?...)序列',但没有另一台服务器。

这两台服务器都使用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 2012-04-10 14:46:53

回答

2

这个问题源于正则表达式和使用和老红宝石。

这很容易由使用RVM引起。

默认情况下,RVM只加载它的配置,它是一个交互式shell。 Cronjobs默认使用sh shell。

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等)的路径。

删除耙子的绝对路径,并在crontab顶部添加SHELL变量后,所有的cron都会开始正确启动。

1

这个错误信息是由他们的正则表达式引擎在红宝石1.8.7引发的;例如参见this question。所以这应该工作,如果你实际上在两台机器上使用红宝石1.9.3。

的Ruby 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 

的Ruby 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或更高版本作为默认的。此外,请注意,cronjobs默认情况下不会提供其用户环境 - 您需要明确地通过它或从登录shell中执行cron作业(请参阅http://danielsz.posterous.com/how-to-run-rvm-scripts-as-cron-jobs)。

+0

+1查找正则表达式和红宝石版本 – 2012-04-10 17:54:21

相关问题