ruby - Mechanize rake 任务在某些服务器上有效,但在其他服务器上无效?

标签 ruby ruby-on-rails-3 rake nokogiri mechanize

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

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

我已经在“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。

完整的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'

结束

如有任何指点,我们将不胜感激!

最佳答案

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

这很容易由使用 RVM 引起。

默认情况下,RVM 仅通过交互式 shell 加载其配置。默认情况下,Cronjobs 使用 sh shell。

RVM 附带一个 shell 包装器来处理这个问题。在你的 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 的绝对路径并在 crontab 顶部添加 SHELL 变量后,所有 crons 将开始正确触发。

关于ruby - Mechanize rake 任务在某些服务器上有效,但在其他服务器上无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090219/

相关文章:

ruby-on-rails - Presenter 的未定义局部变量或方法 `params'

ruby-on-rails - 佣金 Assets :precompile and assets:precompile:all?有什么区别

ruby-on-rails - Rake 和未初始化常量

ruby - 如何反转 ruby​​ 1.9 中的矩阵对象?

ruby-on-rails - ruby on Rails 中的 after_update 回调

ruby - 字符串不能被强制转换为 Fixnum (TypeError)

ruby-on-rails - RSpec:如何测试从 Controller 调用私有(private)辅助方法的辅助方法?

Ruby rake 任务线程优化

ruby - 重新打开STDOUT到/dev/null时指定文件模式有什么意义?

Ruby 元编程 : adding @variables to existing 'initialize' method (using class_eval)