2015-06-25 24 views
66

Sto tentando di distribuire l'app Rails con il server Web Puma. Quando si tenta di avviare il server Puma con un file di configurazione bundle exec puma -C config/puma.rb, viene visualizzato un messaggio che indica che l'indirizzo è già in uso.Indirizzo già in uso - bind (2) (Errno :: EADDRINUSE)

Qualcuno sa come risolvere questo problema?

bundle exec puma -C config/puma.rb 
[23699] Puma starting in cluster mode... 
[23699] * Version 2.11.3 (ruby 2.0.0-p353), codename: Intrepid Squirrel 
[23699] * Min threads: 5, max threads: 5 
[23699] * Environment: development 
[23699] * Process workers: 2 
[23699] * Preloading application 
Jdbc-MySQL is only for use with JRuby 
[23699] * Listening on tcp://0.0.0.0:3000 
/.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE) 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `new' 
    from /Users/lexi87/.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `add_tcp_listener' 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:96:in `block in parse' 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:82:in `each' 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:82:in `parse' 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/runner.rb:119:in `load_and_bind' 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/cluster.rb:302:in `run' 
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/cli.rb:216:in `run' 
    from /rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/bin/puma:10:in `<top (required)>' 
    from /.rvm/gems/ruby-2.0.0-p353/bin/puma:23:in `load' 
    from /.rvm/gems/ruby-2.0.0-p353/bin/puma:23:in `<main>' 
    from /.rvm/gems/ruby-2.0.0-p353/bin/ruby_executable_hooks:15:in `eval' 
    from /.rvm/gems/ruby-2.0.0-p353/bin/ruby_executable_hooks:15:in `<main>' 
+0

è esattamente quello che dice. qualcuno sta già usando la porta 3000. usa netstat per capire chi si trova sulla porta 3000 – Mircea

+1

Quando provo ad ucciderlo ricevo un errore 'kill -59780 PID'. Mi dice "specifiche di segnale non valide". Ho usato 'lsof -wni tcp: 3000' per mostrare cosa sta usando la porta 3000. –

+1

kill -9 59780 (quindi" kill -9 pid_id "in generale) – Mircea

risposta

158

è necessario utilizzare kill -9 59780 (utilizzare lsof -wni tcp:3000 per vedere quale processo utilizzato 3000 porto e ottenere il PID di processo)

o semplicemente modificare la configurazione puma modificare la porta TCP tcp://127.0.0.1:30003000-9292 o altro porto non è stato usato

o si può iniziare la rotaie app utilizzando

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001 
+0

ha funzionato perfettamente, grazie! –

+0

grazie per questa risposta. Ho avuto lo stesso errore con OP. e quello che ho capito è che ho già eseguito 'rails s' su un altro terminale. Ecco perché ho ricevuto questo errore. poi ho usato la porta diff per avviare il server 'rails s -p 9090' –

65

Per uccidere il processo di puma in prima visione

lsof -wni tcp:3000 

per mostrare ciò che utilizza la porta 3000. Quindi utilizzare il PID che viene fornito con il risultato per eseguire il processo di uccisione.

Per esempio dopo aver eseguito lsof tcp -wni: 3000 si potrebbe ottenere qualcosa di simile

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
    ruby 3366 dummy 8u IPv4 16901  0t0 TCP 127.0.0.1:3000 (LISTEN) 

Ora eseguire le seguenti operazioni per uccidere il processo. (Dove 3366 è il PID)

kill -9 3366 

dovrebbe risolvere il problema

+0

Grazie @ sawo-cliff ha risolto il mio problema Ho avuto un'altra applicazione in esecuzione sulla porta 3000. – Nomis

+3

Come questa risposta aggiunge più informazioni rispetto a quella accettata un anno fa? –

+1

@AndreFigueiredo, non sono sicuro di seguire la tua domanda, ma dal poco che posso ricavare da essa, la mia risposta ha aggiunto come sapere quale ID di processo è in esecuzione in modo da sapere cosa uccidere. –

0

Trovato lo script di seguito in questo github issue. Funziona alla grande per me.

#!/usr/bin/env ruby 
port = ARGV.first || 3000 
system("sudo echo kill-server-on #{port}") 

pid = `sudo lsof -iTCP -sTCP:LISTEN -n -P | grep #{port} | awk '{ print $2 }' | head -n 1`.strip 
puts "PID: #{pid}" 
`kill -9 #{pid}` unless pid.empty? 

È possibile eseguirlo in irb o all'interno di un file di ruby.

Per questi ultimi, creare server_killer.rb poi eseguirlo con ruby server_killer.rb

0

si può anche provare questo trucco:

ps aux | grep puma 

esempio di output:

myname   77921 0.0 0.0 2433828 1972 s000 R+ 11:17AM 0:00.00 grep puma 
myname   67661 0.0 2.3 2680504 191204 s002 S+ 11:00AM 0:18.38 puma 3.11.2 (tcp://localhost:3000) [my_proj] 

poi:

kill 67661 
Problemi correlati