Indirizzo già in uso - bind (2) (Errno :: EADDRINUSE)


130

Sto cercando di distribuire l'app Rails con il web server Puma. Quando bundle exec puma -C config/puma.rbprovo ad avviare il server Puma con un file di configurazione, viene visualizzato un errore che indica che l'indirizzo è già in uso.

Qualcuno sa come risolvere questo?

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

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

4
Quando provo ad ucciderlo, ricevo un errore kill -59780 PID. Mi dice invalid signal specification. Ho usato lsof -wni tcp:3000per mostrare ciò che utilizza la porta 3000.
Cornelius Wilson

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

Risposte:


288

È necessario utilizzare kill -9 59780con 59780sostituito con il numero PID trovato (utilizzare lsof -wni tcp:3000per vedere quale processo ha utilizzato la 3000porta e ottenere il processo PID).

Oppure puoi semplicemente modificare la tua configurazione di puma cambiare la porta tcp tcp://127.0.0.1:3000da 3000a 9292o altra porta che non è stata utilizzata.

Oppure puoi avviare la tua app Rails usando:

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

grazie per questa risposta. Ho avuto lo stesso errore con OP. e quello che ho capito è che lo faccio già rails sin un altro terminale. Ecco perché ho avuto quell'errore. poi ho usato la porta diff per avviare il server rails s -p 9090
Fai Zal Dong

129

Per uccidere il processo di puma prima esecuzione

    lsof -wni tcp:3000 

per mostrare ciò che sta usando la porta 3000. Quindi utilizzare il PID fornito con il risultato per eseguire il processo di interruzione.

Ad esempio dopo aver eseguito lsof -wni tcp: 3000 potresti ottenere qualcosa del genere

    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 esegui quanto segue per terminare il processo. (dove 3366 è il PID)

kill -9 3366

Dovrebbe risolvere il problema


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

3
In che modo questa risposta aggiunge più informazioni di quelle accettate un anno fa?
Andre Figueiredo,

1
@AndreFigueiredo, non sono sicuro di seguire la tua domanda, ma dal poco che posso trarne, la mia risposta ha aggiunto come sapere quale ID di processo è in esecuzione per sapere cosa uccidere.
Sawo Cliff

Sì. Vedo ora che la risposta originale DID include le stesse informazioni. Ma non ho capito fino in fondo cosa dovevo fare finché non ho letto questa versione.
Jeff Zivkovic,

28

puoi anche provare questo trucco:

ps aux | grep puma

uscita campione:

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

Usa kill -9 67661se kill 67661non uccide effettivamente il processo per te (come nell'esempio sopra). Ha funzionato per me! Saluti!
William Hampshire,

3

Ho trovato lo script qui sotto in questo numero di github . Funziona benissimo 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?

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

Per quest'ultimo, crealo server_killer.rbquindi eseguiloruby server_killer.rb


Questo ha funzionato per me grazie, ma ho tirato fuori il sudo, poiché non mi sembrava di averne bisogno.
Obromios,

1

Puoi trovare e uccidere i processi in esecuzione: ps aux | grep puma quindi puoi ucciderlo conkill PID


0

Se le soluzioni di cui sopra non funzionano su Ubuntu / Linux, puoi provare questo

sudo fuser -k -n tcp port

Eseguilo più volte per interrompere i processi sulla tua porta di scelta. la porta potrebbe essere 3000 per esempio. Avresti ucciso tutti i processi se non vedessi alcun output dopo aver eseguito il comando

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.