机械化耙子任务适用于某些服务器,但不适用于其他服务器



我不确定这是否应该在ServerFault上或这里提出,因为这是Rails 3.2.3应用程序中特定于Mechanize和Nokogiri的服务器问题。

我有一个耙子任务,从我们的一个服务提供商网站上抓取纬度和经度。

我已经在"crontab -e"中设置了任务以及其他任务。由于某种原因,在两个假设标识的服务器上,其中一个服务器无法完成 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'

结束

任何指示将不胜感激!

问题源于正则表达式和使用和较旧的红宝石。

这很容易由使用 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 变量后,所有 crons 将开始正确触发。

此错误消息是由 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 红宝石。首先,检查您是否已将 1.9.2 或更高版本设置为默认值

rvm 1.9.2 --default

并且 RVM 可执行文件位于任何可能安装的系统 Ruby 之前的路径中。另外,请注意,默认情况下 cronjobs 没有可用的用户环境 - 您需要显式传递该环境或从登录 shell 中执行 cron 作业(请参阅示例 http://danielsz.posterous.com/how-to-run-rvm-scripts-as-cron-jobs)。

相关内容

  • 没有找到相关文章

最新更新