2010-11-09 12 views
58

Tôi có một ứng dụng Ruby on Rails mà tôi đang triển khai trên một máy tính chạy Mac OS X 10.6. Mã nơi sự cố phát sinh được chạy bởi một delay_job. Vấn đề chỉ xảy ra khi nó được chạy qua delay_job. Nếu tôi chạy nó trong một giao diện điều khiển (rails console production) hoặc gọi API trực tiếp thông qua cURL, nó hoạt động mà không có bất kỳ vấn đề. Ngoài ra, toàn bộ quá trình hoạt động mà không có vấn đề trong môi trường phát triển của tôi.getaddrinfo: nodename và servname được cung cấp, hoặc không biết

Về cơ bản, mã hoạt động ở một nơi, nhưng vì một lý do nào đó, nó không hoạt động ở nơi nào. Tôi đã tìm kiếm và tìm thấy một vài tài nguyên, nhưng không có đề xuất nào áp dụng hoặc tạo ra bất kỳ sự khác biệt nào. Khi tôi đăng nhập vào máy chủ và chạy các lệnh, mọi thứ đều hoạt động. Nhưng vì một số lý do khi chúng được chạy/bắt đầu bởi Capistrano, nó không hoạt động.

Bất kỳ trợ giúp nào được đánh giá cao.

Ghi chú quan trọng:

  • của Ruby phiên bản: 1.9.2-p0
  • Rails phiên bản: 3.0.1
  • phiên bản delayed_job: mới nhất (từ collectiveidea/delayed_job)
  • phiên bản còn lại-client: 1.6 .1

Mã:

class CallApi < Struct.new(:num) 
    def perform 
    log "Entering perform" 
    apinum = num || 5 
    log "ApiNum = #{apinum}" 
    results = attempt(2,10) do 
     ActiveSupport::JSON.decode(RestClient.get(API_URL, {:params => {:apinum => apinum}})) 
    end 
    log "Results retrieved. (count: #{results.count})" 
    end 

    def log(message) 
    Delayed::Worker.logger.info "[CallApi] #{Time.now} - #{message}" 
    end 
end 

Môi trường Config (lưu ý: url là giả, nhưng có dạng giống như một thực):

API_URL = "http://api.example.org/api_endpoint" 
# Originally, I had "http://" before the beginning, but found a 
# post mentioning that Net::Http.start didn't like that. 
# So I tried it both ways. 
# The same error occurs regardless of if the "http://" is there. 

Gọi nơi lỗi xảy ra:

RestClient.get(API_URL, {:params => {:apinum => apinum}}) 

Lỗi:

getaddrinfo: nodename nor servname provided, or not known 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `initialize' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `open' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `block in connect' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/timeout.rb:44:in `timeout' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/timeout.rb:87:in `timeout' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:644:in `connect' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:637:in `do_start' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/net/http.rb:626:in `start' 
/Users/api/.rvm/gems/[email protected]/gems/rest-client-1.6.1/lib/restclient/request.rb:166:in `transmit' 
/Users/api/.rvm/gems/[email protected]/gems/rest-client-1.6.1/lib/restclient/request.rb:60:in `execute' 
/Users/api/.rvm/gems/[email protected]/gems/rest-client-1.6.1/lib/restclient/request.rb:31:in `execute' 
/Users/api/.rvm/gems/[email protected]/gems/rest-client-1.6.1/lib/restclient.rb:68:in `get' 
/private/var/www/project-gemset/releases/20101109002137/lib/call_api.rb:7:in `block in perform' 
/Users/api/.rvm/gems/[email protected]/gems/attempt-0.2.0/lib/attempt.rb:70:in `attempt' 
/Users/api/.rvm/gems/[email protected]/gems/attempt-0.2.0/lib/attempt.rb:114:in `attempt' 
/private/var/www/project-gemset/releases/20101109002137/lib/call_api.rb:6:in `perform' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/backend/base.rb:77:in `invoke_job' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:118:in `block (2 levels) in run' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/timeout.rb:57:in `timeout' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:118:in `block in run' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/benchmark.rb:309:in `realtime' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:117:in `run' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:176:in `reserve_and_run_one_job' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:102:in `block in work_off' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:101:in `times' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:101:in `work_off' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:76:in `block (2 levels) in start' 
/Users/api/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/benchmark.rb:309:in `realtime' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:75:in `block in start' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:72:in `loop' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/worker.rb:72:in `start' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:100:in `run' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:79:in `block in run_process' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application.rb:250:in `call' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application.rb:250:in `block in start_proc' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/daemonize.rb:199:in `call' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/daemonize.rb:199:in `call_as_daemon' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application.rb:254:in `start_proc' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application.rb:294:in `start' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application_group.rb:159:in `block (2 levels) in start_all' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application_group.rb:158:in `fork' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application_group.rb:158:in `block in start_all' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application_group.rb:157:in `each' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/application_group.rb:157:in `start_all' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/controller.rb:80:in `run' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons.rb:193:in `block in run_proc' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/cmdline.rb:112:in `call' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons/cmdline.rb:112:in `catch_exceptions' 
/Users/api/.rvm/gems/[email protected]/gems/daemons-1.1.0/lib/daemons.rb:192:in `run_proc' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:78:in `run_process' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:72:in `block in daemonize' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:70:in `times' 
/Users/api/.rvm/gems/[email protected]/bundler/gems/delayed_job-aba9905764c2/lib/delayed/command.rb:70:in `daemonize' 
script/delayed_job:5:in `' 
+0

Tôi nhận được thông báo này khi đang cố gửi email qua Dấu bưu điện. Hóa ra DNS của họ đang gặp sự cố khi giải quyết nên đây là lỗi xuất hiện như trên ứng dụng Rails của chúng tôi. –

Trả lời

44

Lỗi xảy ra khi độ phân giải DNS không thành công. Kiểm tra xem bạn có thể wget (hoặc curl) url api từ dòng lệnh không. Thay đổi máy chủ DNS và kiểm tra nó có thể hữu ích.

+3

Nó hoạt động tốt với cURL và thông qua giao diện điều khiển đường ray. – ChronoPositron

+2

Trong khi điều này dường như là điều kỹ thuật đang xảy ra, tôi vẫn không biết tại sao nó lại xảy ra. Khi tôi đăng nhập vào máy chủ và chạy các lệnh, mọi thứ đều hoạt động.Nhưng vì một số lý do khi chúng được chạy/bắt đầu bởi Capistrano, nó không hoạt động. Vì tôi không tìm được cách nào để sửa nó, tôi chỉ chấp nhận câu trả lời này và cho mọi người một phiếu bầu. – ChronoPositron

+3

Đánh thức máy Mac của tôi từ chế độ ngủ, chạy thử nghiệm dưa chuột và nhận được lỗi này. Tôi bật tắt wifi của tôi sau đó, và nó hoạt động. Dường như thực sự là DNS liên quan nhưng điều đó đã sửa nó. –

9

RestClient của khách hàng còn lại cần sơ đồ http: khi giải quyết URL. Nó gọi Net::HTTP cho bạn, mà không muốn phần http:, nhưng khách hàng còn lại sẽ lo việc đó.

URL có phải là địa chỉ thực tế bạn đang cố truy cập không? example.org là tên miền hợp lệ được sử dụng để kiểm tra và tài liệu và có thể truy cập được; Tôi mong đợi các phần "api" và "api_endpoint" bị lỗi và thấy rằng khi tôi cố gắng tiếp cận họ.

require 'socket' 

IPSocket.getaddress('example.org') # => "2620:0:2d0:200::10" 
IPSocket.getaddress('api.example.org') # => 
# ~> -:7:in `getaddress': getaddrinfo: nodename nor servname provided, or not known (SocketError) 
# ~> from -:7:in `<main>' 

Đây là những gì tôi nhận được sử dụng Curl:

greg-mbp-wireless:~ greg$ curl api.example.org/api_endpoint 
curl: (6) Couldn't resolve host 'api.example.org' 
greg-mbp-wireless:~ greg$ curl example.org/api_endpoint 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>404 Not Found</title> 
</head><body> 
<h1>Not Found</h1> 
<p>The requested URL /api_endpoint was not found on this server.</p> 
<hr> 
<address>Apache Server at example.org Port 80</address> 
</body></html> 
greg-mbp-wireless:~ greg$ curl example.org 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<HTML> 
<HEAD> 
    <META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <TITLE>Example Web Page</TITLE> 
</HEAD> 
<body> 
<p>You have reached this web page by typing &quot;example.com&quot;, 
&quot;example.net&quot;,&quot;example.org&quot 
    or &quot;example.edu&quot; into your web browser.</p> 
<p>These domain names are reserved for use in documentation and are not available 
    for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 
    2606</a>, Section 3.</p> 
</BODY> 
</HTML> 
+0

API_URL Tôi có trong câu hỏi chỉ là một url mẫu giả mạo tuân theo định dạng giống với URL thực. Chạy các lệnh đó trực tiếp trên máy chủ với url thực hoạt động và trả về mọi thứ như tôi mong đợi. Dường như vấn đề chỉ xảy ra khi delay_job được bắt đầu thông qua Capistrano. (Tôi sẽ chỉnh sửa câu hỏi để ghi chú điều này) – ChronoPositron

+0

Ah. Được. example.com và anh chị em của nó là dành cho tài liệu, nhưng nhiều người cố gắng sử dụng nó để thử nghiệm, điều này sẽ không đưa họ quá xa. –

9

tôi chạy vào một tình huống tương tự ngày nay - triển khai ứng dụng lên một x máy chủ mac os, và nhận được thông báo 'getaddrinfo' khi tôi cố gắng truy cập api bên ngoài. Nó chỉ ra rằng lỗi xảy ra khi phiên ssh ban đầu khởi chạy ứng dụng không còn hoạt động nữa. Đó là lý do tại sao mọi thứ hoạt động hoàn hảo nếu bạn ssh vào máy chủ của mình và chạy các lệnh bằng tay (hoặc khởi động máy chủ theo cách thủ công) - miễn là bạn giữ phiên ssh của mình còn sống, lỗi này sẽ không xảy ra.

Cho dù đây là lỗi hay lừa đảo trong OS X, tôi không chắc chắn. Đây là trang dẫn tôi đến giải pháp - http://lists.apple.com/archives/unix-porting/2010/Jul/msg00001.html

Tất cả những gì tôi phải làm là cập nhật tác vụ capistrano của mình để khởi chạy ứng dụng bằng cách sử dụng 'nohup'. Vì vậy, thay đổi

run "cd #{current_path} && RAILS_ENV=production unicorn_rails -c config/unicorn.rb -D" 

để

run "cd #{current_path} && RAILS_ENV=production nohup unicorn_rails -c config/unicorn.rb -D" 

đã làm các trick cho tôi.

Hy vọng điều này sẽ giúp ai đó - thật là một nỗi đau để tìm ra!

+0

Đối với những người có vấn đề này với 'resque' bạn có thể chạy rake với' nohup' và điều này sẽ giải quyết vấn đề. nghĩa là 'gói exec nohup rake resque: work'. Cảm ơn Joshua! – ipd

4

Tôi khởi động lại máy tính của mình (Mac Mountain Lion) và sự cố đã được khắc phục. Một cái gì đó phải làm với vỏ nghĩ rằng nó đã bị ngắt kết nối từ internet tôi nghĩ.

Khởi động lại vỏ của bạn theo một cách nhất định có thể giải quyết vấn đề này. Tuy nhiên, chỉ cần mở một phiên làm việc/cửa sổ mới không hoạt động.

+0

Ngắt kết nối khỏi wifi/ethernet của bạn và kết nối lại cũng có thể hoạt động. – coloradoblue

+0

Tôi đã thử sudo postfix bắt đầu và tiếp tục nhận được lỗi. Khởi động lại mac đã làm việc. – kk1957

+0

Khởi động lại máy Mac của tôi không hoạt động. – IIllIIll

2

Tôi đã thấy lỗi này không liên quan đến đường ray. Hóa ra thử nghiệm của tôi đã cố gắng sử dụng một cổng quá cao (lớn hơn 65535).

Mã này sẽ tạo ra lỗi trong câu hỏi

require 'socket' 
Socket.getaddrinfo("127.0.0.1", "65536") 
+0

Không! Không phải vấn đề – IIllIIll

0

Tôi đã nhận lỗi trong khi cố gắng để phát triển trong khi ngắt kết nối với Internet. Tuy nhiên, trang web tôi đang làm việc cần phải có thể nói chuyện với một số trang web khác, vì vậy nó bị nghẹt thở khi nó không thể làm như vậy. Kết nối với internet đã sửa lỗi.

4

Tôi đã khắc phục sự cố này chỉ đơn giản bằng cách đóng và mở lại Thiết bị đầu cuối.

0

Nếu tất cả những điều trên không, hãy thử chuyển sang UNIX Đường dây Endings, hoặc làm:

brew install dos2unix 
sudo dos2unix -c mac /private/etc/hosts 

Có thể mã hóa host là sai.

hy vọng điều này sẽ giúp

0

Tôi gặp sự cố này đang chạy rake db:create. Trang này đã đưa tôi vào vấn đề DNS. Tôi đã kiểm tra kết nối VPN của mình và thấy nó đã bị ngắt kết nối vì một lý do nào đó. Tôi kết nối lại và bây giờ rake làm việc mà không có một xô.

1

Để tránh vấn đề này, chúng ta có thể liên kết với 127.0.0.1 thay vì localhost:

bin/rails server -b 127.0.0.1

+0

Điều này phù hợp với tôi, nhưng tại sao tệp lưu trữ thay đổi không giải quyết được sự cố? Bất kỳ ý tưởng về nguyên nhân? – rangeOShun

+0

@rangeOShun Tôi cũng không thể biết được. Một trong những macOS của tôi luôn có vấn đề này, không chỉ cho Rails mà còn cho tất cả những người khác. –

2

Tôi đã nhận lỗi tương tự khi tôi kiểm tra localhost được đặt trong tập tin host nó được bằng cách nào đó không được thiết lập. Thiết lập localhost để 127.0.0.1 giải quyết nó.

sudo vi /etc/hosts 
>> 

127.0.0.1  localhost