Endereço já em uso - bind (2) (Errno :: EADDRINUSE)

130

Estou tentando implantar o aplicativo Rails com o servidor da web Puma. Ao tentar iniciar o servidor Puma com um arquivo de configuração bundle exec puma -C config/puma.rb, recebo um erro informando que o endereço já está em uso.

Alguém sabe como consertar isso?

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
fonte
1
é exatamente o que diz. alguém já está usando a porta 3000. uso netstat para descobrir quem está na porta 3000
Mircea
4
Quando tento matá-lo, recebo um erro kill -59780 PID. Me diz invalid signal specification. I utilizado lsof -wni tcp:3000para mostrar o que está usando a porta 3000.
Cornelius Wilson
1
kill -9 59780 (então "kill -9 pid_id" em geral)
Mircea

Respostas:

288

Você precisa usar kill -9 59780com 59780substituído com encontrada PID número (uso lsof -wni tcp:3000para ver qual processo utilizado3000 porto e começar o processo PID).

Ou você pode simplesmente modificar sua configuração do puma alterar a porta TCP tcp://127.0.0.1:3000de30009292 ou para outra porta que não foi usada.

Ou você pode iniciar seu aplicativo rails usando:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Zoker
fonte
obrigado por esta resposta. Eu tenho o mesmo erro com OP. e o que percebi é que já faço rails sem outro terminal. Foi por isso que recebi esse erro. então usei a porta diff para iniciar o servidor rails s -p 9090
Fai Zal Dong
129

Para matar o processo do puma, execute primeiro

    lsof -wni tcp:3000 

para mostrar o que está usando a porta 3000. Em seguida, use o PID que acompanha o resultado para executar o processo de interrupção.

Por exemplo, após executar lsof -wni tcp: 3000, você poderá obter 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)

Agora execute o seguinte para interromper o processo. (onde 3366 é o PID)

kill -9 3366

Deve resolver o problema

Penhasco de Sawo
fonte
Obrigado @ SAWO-precipício que resolveu o meu problema que eu tinha um outro aplicativo em execução na porta 3000.
Nomis
3
Como esta resposta adiciona mais informações do que as aceitas há um ano?
Andre Figueiredo
1
@AndreFigueiredo, não tenho certeza se sigo a sua pergunta, mas pelo pouco que consigo entender, minha resposta acrescentou como saber qual ID de processo está sendo executada para saber o que matar.
Sawo Cliff
Sim. Agora vejo que a resposta original incluiu a mesma informação. Mas não entendi completamente o que precisava fazer até ler esta versão.
21416 Jeff Zivkovic
28

você também pode tentar este truque:

ps aux | grep puma

saída de amostra:

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]

então:

kill 67661
ana
fonte
Use kill -9 67661se kill 67661realmente não interromper o processo para você (como no exemplo acima). Isso funcionou para mim! Felicidades!
William Hampshire
3

Encontre o script abaixo nesta edição do github . Funciona muito bem para mim.

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

Você pode executá-lo no irb ou dentro de um arquivo ruby.

Para o último, crie server_killer.rbe execute-o comruby server_killer.rb

Flavio Wuensche
fonte
Isso funcionou para mim, obrigado, mas tirei o sudo, pois não parecia precisar dele.
Obromios 04/04
1

Você pode encontrar e matar os processos em execução: ps aux | grep puma Em seguida, você pode matá-lo comkill PID

Todos
fonte
0

Se as soluções acima não funcionarem no ubuntu / linux, você pode tentar isso

sudo fuser -k -n tcp port

Execute-o várias vezes para eliminar os processos na sua porta de escolha. porta poderia ser 3000, por exemplo. Você mataria todos os processos se não vir nenhuma saída após executar o comando

Nsoseka
fonte