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.