Adres już używany - bind (2) (Errno :: EADDRINUSE)

134

Próbuję wdrożyć aplikację Rails na serwerze internetowym Puma. Podczas próby uruchomienia serwera Puma z plikiem konfiguracyjnym pojawia bundle exec puma -C config/puma.rbsię błąd, że adres jest już używany.

Czy ktoś wie, jak to naprawić?

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
źródło
1
dokładnie to, co mówi. ktoś już korzysta z portu 3000. użyj netstat, aby dowiedzieć się, kto jest na porcie 3000
Mircea.
4
Kiedy próbuję go zabić, pojawia się błąd kill -59780 PID. Mówi mi invalid signal specification. Kiedyś lsof -wni tcp:3000pokazywałem, co używa portu 3000.
Cornelius Wilson,
1
kill -9 59780 (więc ogólnie „kill -9 pid_id”)
Mircea,

Odpowiedzi:

294

Musisz użyć kill -9 59780z 59780zastąpionym znalezionym numerem PID (użyj, lsof -wni tcp:3000aby zobaczyć, który proces używał 3000portu i uzyskać PID procesu).

Lub możesz po prostu zmodyfikować konfigurację puma, zmienić port TCP tcp://127.0.0.1:3000z 3000na 9292lub inny port, który nie był używany.

Możesz też uruchomić aplikację rails, używając:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Zoker
źródło
1
dziękuję za tę odpowiedź. Mam ten sam błąd z OP. i zdałem sobie sprawę, że robię już rails sna innym terminalu. Dlatego właśnie otrzymałem ten błąd. następnie użyłem portu diff do uruchomienia serwera rails s -p 9090
Fai Zal Dong
135

Aby zabić proces pumy, najpierw uruchom

    lsof -wni tcp:3000 

aby pokazać, co używa portu 3000. Następnie użyj identyfikatora PID, który jest dołączony do wyniku, aby uruchomić proces zabijania.

Na przykład po uruchomieniu lsof -wni tcp: 3000 możesz otrzymać coś takiego

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

Teraz uruchom następujące, aby zakończyć proces. (gdzie 3366 to PID)

kill -9 3366

Powinno rozwiązać problem

Sawo Cliff
źródło
Dzięki @ sawo-cliff rozwiązałem mój problem. Miałem inną aplikację działającą na porcie 3000.
Nomis
3
W jaki sposób ta odpowiedź dodaje więcej informacji niż zaakceptowana rok temu?
Andre Figueiredo
1
@AndreFigueiredo, nie do końca jestem pewien, czy rozumiem twoje pytanie, ale z niewielkiej ilości informacji, które mogę z niego wyciągnąć, moja odpowiedź dodała, jak dowiedzieć się, który identyfikator procesu jest uruchomiony, aby wiedzieć, co zabić.
Sawo Cliff
Tak. Teraz widzę, że oryginalna odpowiedź DID zawierała te same informacje. Ale nie do końca rozumiałem, co muszę zrobić, dopóki nie przeczytałem tej wersji.
Jeff Zivkovic,
30

możesz też wypróbować tę sztuczkę:

ps aux | grep puma

przykładowe wyjście:

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]

następnie:

kill -9 67661
ana
źródło
Użyj kill -9 67661if kill 67661faktycznie nie zabije procesu za Ciebie (jak w powyższym przykładzie). To zadziałało dla mnie! Twoje zdrowie!
William Hampshire
3

Znalazłem skrypt poniżej w tym numerze na githubie . U mnie działa świetnie.

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

Możesz go uruchomić w irb lub w pliku ruby.

W tym drugim przypadku utwórz, server_killer.rba następnie uruchom zruby server_killer.rb

Flavio Wuensche
źródło
To zadziałało dla mnie, dziękuję, ale wyjąłem sudo, ponieważ nie wydawało mi się, że go potrzebuję.
Obromios
1

Możesz znaleźć i zabić uruchomione procesy: ps aux | grep puma Następnie możesz je zabićkill PID

Ali
źródło
0

Jeśli powyższe rozwiązania nie działają na systemie Ubuntu / Linux, możesz spróbować tego

sudo fuser -k -n tcp port

Uruchom go kilka razy, aby zabić procesy na wybranym porcie. na przykład port może wynosić 3000. Zabiłbyś wszystkie procesy, gdyby po uruchomieniu polecenia nie było żadnych danych wyjściowych

Nsoseka
źródło
0

Może jest stary, ale w moim przypadku był to spowodowane dockerem. Mam nadzieję, że pomoże to innym.

bxorcloud
źródło