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

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

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


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

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


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


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


0

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.