Dirección ya en uso - bind (2) (Errno :: EADDRINUSE)

130

Estoy tratando de implementar la aplicación Rails con el servidor web Puma. Cuando intento iniciar el servidor Puma con un archivo de configuración bundle exec puma -C config/puma.rb, recibo un error de que la dirección ya está en uso.

¿Alguien sabe cómo solucionar esto?

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>'
Cornelius Wilson
fuente
1
Es exactamente lo que dice. alguien ya está usando el puerto 3000. use netstat para averiguar quién está en el puerto 3000
Mircea
44
Cuando trato de matarlo me sale un error kill -59780 PID. Me dice invalid signal specification. Solía lsof -wni tcp:3000mostrar lo que está usando el puerto 3000.
Cornelius Wilson
1
kill -9 59780 (así que "kill -9 pid_id" en general)
Mircea

Respuestas:

288

Debe usar kill -9 59780con 59780reemplazado por el número de PID encontrado (use lsof -wni tcp:3000para ver qué proceso usó el 3000puerto y obtener el PID del proceso).

O simplemente puede modificar su configuración puma cambiar el puerto TCP tcp://127.0.0.1:3000a partir 3000de 9292u otro puerto que no se utiliza.

O puede iniciar su aplicación de rieles usando:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Zoker
fuente
gracias por esta respuesta Tengo el mismo error con OP. y me di cuenta de que ya lo hago rails sen otra terminal. Entonces es por eso que obtuve ese error. luego usé el puerto diff para iniciar el servidor rails s -p 9090
Fai Zal Dong
129

Para matar el proceso de puma primero ejecuta

    lsof -wni tcp:3000 

para mostrar qué está usando el puerto 3000. Luego, use el PID que viene con el resultado para ejecutar el proceso de eliminación.

Por ejemplo, después de ejecutar lsof -wni tcp: 3000, puede obtener algo como

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

Ahora ejecute lo siguiente para eliminar el proceso. (donde 3366 es el PID)

kill -9 3366

Debería resolver el problema

Un acantilado
fuente
Gracias @ sawo-cliff resolvió mi problema. Tenía otra aplicación ejecutándose en el puerto 3000.
Nomis
3
¿Cómo esta respuesta agrega más información que la aceptada hace un año?
Andre Figueiredo
1
@AndreFigueiredo, no estoy seguro de seguir tu pregunta, pero por lo poco que puedo deducir de ella, mi respuesta agregó cómo saber qué ID de proceso se está ejecutando para saber qué matar.
Sawo Cliff el
Si. Ahora puedo ver que la respuesta original sí incluía la misma información. Pero no entendí completamente lo que tenía que hacer hasta que leí esta versión.
Jeff Zivkovic
28

También puedes probar este truco:

ps aux | grep puma

salida de muestra:

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]

luego:

kill 67661
ana
fuente
Use kill -9 67661if en kill 67661realidad no mata el proceso por usted (como en el ejemplo anterior). Eso funcionó para mí! ¡Salud!
William Hampshire
3

Encontré el script a continuación en este número de github . Funciona muy bien para mi.

#!/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?

Puede ejecutarlo en irb o dentro de un archivo ruby.

Para este último, cree y server_killer.rbluego ejecútelo conruby server_killer.rb

Flavio Wuensche
fuente
Esto funcionó para mí, gracias, pero saqué el sudo, ya que no parecía necesitarlo.
Obromios
1

Puede encontrar y eliminar los procesos en ejecución: ps aux | grep puma luego puede eliminarlo conkill PID

Ali
fuente
0

Si las soluciones anteriores no funcionan en ubuntu / linux, puede probar esto

sudo fuser -k -n tcp port

Ejecútelo varias veces para eliminar procesos en el puerto que elija. el puerto podría ser 3000 por ejemplo. Hubiera matado todos los procesos si no ve salida después de ejecutar el comando

Nsoseka
fuente