2010-11-09 4 views
58

Ho un'applicazione Ruby on Rails che sto distribuendo su un computer con Mac OS X 10.6. Il codice in cui sorge il problema è gestito da un delayed_job. Il problema si verifica solo quando viene eseguito attraverso delayed_job. Se lo eseguo all'interno di una console (rails console production) o chiami l'API direttamente tramite cURL, funziona senza problemi. Inoltre, l'intero processo funziona senza problemi nel mio ambiente di sviluppo.getaddrinfo: nome nodo o servername fornito o non noto

Fondamentalmente, il codice funziona in un posto, ma per qualche motivo, non riesce dove deve funzionare. Ho cercato e trovato alcune risorse, ma nessuno dei suggerimenti si applica o fa alcuna differenza. Quando accedo al server ed eseguo i comandi, tutto funziona. Ma per qualche motivo quando vengono eseguiti/avviati da Capistrano, non funziona.

Qualsiasi aiuto è molto apprezzato.

Note importanti:

  • Rubino Versione: 1.9.2-p0
  • Rails versione: 3.0.1
  • versione delayed_job: ultima (da collectiveidea/delayed_job)
  • versione resto-client: 1.6 .1

Codice:

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 

Ambiente Config (nota: l'url è falso, ma della stessa forma di quella vera):

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. 

chiamata in cui l'errore si verifica:

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

Errore:

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

Ho ricevuto questo messaggio in modo imprevisto durante il tentativo di inviare un'e-mail tramite il timbro postale. Si è scoperto che il loro DNS stava avendo un problema risolvendo così questo è ciò che l'errore è apparso sulla nostra app Rails. –

risposta

44

L'errore si verifica quando la risoluzione DNS non riesce. Controlla se puoi wget (o arricciare) l'api url dalla riga di comando. Cambiare il server DNS e testarlo potrebbe aiutare.

+3

Funziona bene con cURL e attraverso la console di rails. – ChronoPositron

+2

Mentre questo sembra essere la cosa tecnica che sta andando male, sono ancora in perdita per perché succede. Quando accedo al server ed eseguo i comandi, tutto funziona.Ma per qualche motivo quando vengono eseguiti/avviati da Capistrano, non funziona. Poiché non ho trovato alcun modo per risolverlo, accetterò questa risposta e darò un voto a tutti gli altri. – ChronoPositron

+3

Ho svegliato il mio Mac dal sonno, ho eseguito alcuni test di cetriolo e ho ricevuto questo errore. Ho attivato e disattivato la mia connessione wifi, e ha funzionato. Sembra essere effettivamente correlato al DNS ma è stato risolto. –

9

rest-client RestClient ha bisogno dello schema http: durante la risoluzione dell'URL. Chiama Net::HTTP per te, che non vuole la parte http:, ma il client di riposo si occupa di ciò.

L'URL è l'attuale che si sta tentando di raggiungere? example.org è un dominio valido utilizzato per test e documentazione ed è raggiungibile; Mi aspetterei che le parti "api" e "api_endpoint" falliscano e lo vedremo quando cercherò di raggiungerle.

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>' 

Ecco cosa ottengo utilizzando 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

L'API_URL che ho nella domanda è solo un esempio di URL falso che segue lo stesso formato di quello reale. L'esecuzione di questi comandi direttamente sul server con l'url reale funziona e restituisce tutto come mi aspetterei. Sembra che il problema si verifica solo quando viene avviato delayed_job tramite Capistrano. (Modificherò la domanda per prenderne nota) – ChronoPositron

+0

Ah. Ok. example.com ed i suoi fratelli sono per la documentazione, ma molte persone cercano di usarlo per i test, che non li porteranno troppo lontano. –

9

mi sono imbattuto in una situazione simile oggi - la distribuzione di un app a un server di Mac OS X, e ricevere il messaggio 'getaddrinfo' quando ho provato a accedere a una API esterna. Si scopre che l'errore si verifica quando la sessione ssh che ha lanciato l'app in origine non è più attiva. Ecco perché tutto funziona perfettamente se si esegue l'ssh sul server e si eseguono i comandi manualmente (o si avvia il server manualmente), a patto che si mantenga attiva la sessione ssh, questo errore non si verificherà.

Se questo è un bug o una stranezza in OS X, non sono sicuro. Ecco la pagina che mi ha portato alla soluzione - http://lists.apple.com/archives/unix-porting/2010/Jul/msg00001.html

Tutto quello che dovevo fare era aggiornare la mia attività capistrano per avviare l'app usando 'nohup'. Quindi cambiando

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

a

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

ha fatto il trucco per me.

Spero che questo aiuti qualcuno - è stato piuttosto difficile capirlo!

+0

Per coloro che hanno questo problema con 'resque' puoi eseguire rake con' nohup' e questo risolverà il problema. ad esempio 'bundle exec nohup rake resque: work'. Grazie Joshua! – ipd

4

Ho riavviato il mio computer (Mac Mountain Lion) e il problema si è risolto. Qualcosa che ha a che fare con la shell pensando che sia stato disconnesso da internet, credo.

Riavviare la shell in un modo definito può risolvere anche questo problema. Semplicemente aprendo una nuova sessione/finestra, tuttavia, non ha funzionato.

+0

Anche la disconnessione dalla rete Wi-Fi/Ethernet e la riconnessione potrebbero funzionare. – coloradoblue

+0

Ho provato sudo postfix start e ho continuato a ricevere l'errore. Riavviare il mac ha funzionato. – kk1957

+0

Il riavvio del mio Mac non ha funzionato. – IIllIIll

2

Stavo vedendo questo errore non correlato alle guide. Si è scoperto che il mio test stava tentando di utilizzare una porta troppo alta (maggiore di 65535).

Questo codice produrrà l'errore in questione

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

No! Non è il problema – IIllIIll

0

ho ottenuto l'errore durante il tentativo di sviluppare durante la disconnessione a Internet. Tuttavia, il sito web su cui stavo lavorando deve essere in grado di parlare con altri siti Web, quindi si è bloccato quando non è stato possibile farlo. La connessione a Internet ha corretto l'errore.

4

Ho risolto questo problema semplicemente chiudendo e riaprendo il terminale.

0

Se tutto quanto sopra non riesce, cercare di convertire a UNIX Linea Endings, o fare:

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

Forse la codifica host è sbagliato.

Spero che questo aiuti

0

ho avuto questo problema in esecuzione rake db:create. Questa pagina mi ha indicato nel problema DNS. Ho controllato la mia connessione VPN e ho scoperto che era scollegato per qualche motivo. Mi sono ricollegato e ora il rake ha funzionato senza intoppi.

1

Per evitare questo problema, siamo in grado di legarsi a 127.0.0.1 invece di localhost:

bin/rails server -b 127.0.0.1

+0

Questo funziona per me, ma perché il file degli host che cambia non risolve il problema? Qualche idea sulla causa? – rangeOShun

+0

@rangeOShun Non riesco a capire neanche. Uno dei miei macOS ha sempre questo problema, non solo per Rails ma per tutti gli altri. –

2

ho ottenuto lo stesso errore quando controllo il localhost si trova nel file hosts non è in qualche modo impostato. Impostando localhost su 127.0.0.1 risolto.

sudo vi /etc/hosts 
>> 

127.0.0.1  localhost