Bereits verwendete Adresse - bind (2) (Errno :: EADDRINUSE)

130

Ich versuche, die Rails-App mit dem Puma-Webserver bereitzustellen. Beim Versuch, den Puma-Server mit einer Konfigurationsdatei zu starten bundle exec puma -C config/puma.rb, wird die Fehlermeldung angezeigt , dass die Adresse bereits verwendet wird.

Weiß jemand, wie man das behebt?

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
quelle
1
es ist genau das, was es sagt. Jemand benutzt bereits Port 3000. Verwenden Sie netstat, um herauszufinden, wer sich auf Port 3000 befindet
Mircea
4
Wenn ich versuche, es zu töten, erhalte ich eine Fehlermeldung kill -59780 PID. Sagt mir invalid signal specification. Ich habe immer lsof -wni tcp:3000gezeigt, was Port 3000 verwendet.
Cornelius Wilson
1
kill -9 59780 (also "kill -9 pid_id" im Allgemeinen)
Mircea

Antworten:

287

Sie müssen kill -9 59780mit 59780ersetzt durch gefundene PID-Nummer verwenden (verwenden Sie, um lsof -wni tcp:3000zu sehen, welcher Prozess den 3000Port verwendet, und um die Prozess-PID zu erhalten).

Oder Sie können einfach Ihre Puma-Konfiguration ändern und den TCP-Port tcp://127.0.0.1:3000von 3000zu 9292oder einen anderen Port ändern, der nicht verwendet wurde.

Oder Sie können Ihre Rails-App starten, indem Sie Folgendes verwenden:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Zoker
quelle
Danke für diese Antwort. Ich habe den gleichen Fehler mit OP. und mir wurde klar, dass ich es bereits rails san einem anderen Terminal mache . Deshalb habe ich diesen Fehler bekommen. dann habe ich diff port benutzt um den server zu starten rails s -p 9090
Fai Zal Dong
129

Um den Puma-Prozess zu beenden, führen Sie ihn zuerst aus

    lsof -wni tcp:3000 

Verwenden Sie dann die PID, die mit dem Ergebnis geliefert wird, um den Kill-Prozess auszuführen.

Wenn Sie beispielsweise lsof -wni tcp: 3000 ausführen, erhalten Sie möglicherweise so etwas wie

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

Führen Sie nun Folgendes aus, um den Prozess abzubrechen. (wobei 3366 die PID ist)

kill -9 3366

Sollte das Problem beheben

Sawo Cliff
quelle
Danke @ sawo-cliff es hat mein Problem gelöst Ich hatte eine andere Anwendung auf Port 3000.
Nomis
3
Wie fügt diese Antwort mehr Informationen hinzu als vor einem Jahr angenommen?
Andre Figueiredo
1
@AndreFigueiredo, ich bin mir nicht ganz sicher, ob ich Ihrer Frage folge, aber von dem Wenigen, das ich daraus ableiten kann, fügte meine Antwort hinzu, wie man weiß, welche Prozess-ID ausgeführt wird, um zu wissen, was zu töten ist.
Sawo Cliff
Ja. Ich kann jetzt sehen, dass die ursprüngliche Antwort die gleichen Informationen enthielt. Aber ich habe nicht ganz verstanden, was ich tun musste, bis ich diese Version gelesen habe.
Jeff Zivkovic
28

Sie können diesen Trick auch ausprobieren:

ps aux | grep puma

Beispielausgabe:

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]

dann:

kill 67661
ana
quelle
Verwenden Sie, kill -9 67661wenn kill 67661der Prozess für Sie nicht tatsächlich abgebrochen wird (wie im obigen Beispiel). Das hat bei mir funktioniert! Prost!
William Hampshire
3

Das folgende Skript wurde in dieser Github-Ausgabe gefunden . Funktioniert super für mich.

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

Sie können es entweder in irb oder in einer Ruby-Datei ausführen.

Für letzteres erstellen Sie es server_killer.rbund führen Sie es mit ausruby server_killer.rb

Flavio Wuensche
quelle
Das hat bei mir funktioniert, danke, aber ich habe den Sudo herausgenommen, da ich ihn anscheinend nicht brauchte.
Obromios
1

Sie können die laufenden Prozesse finden und beenden: ps aux | grep puma Dann können Sie sie mit beendenkill PID

Ali
quelle
0

Wenn die oben genannten Lösungen unter Ubuntu / Linux nicht funktionieren, können Sie dies versuchen

sudo fuser -k -n tcp port

Führen Sie es mehrmals aus, um Prozesse auf dem Port Ihrer Wahl abzubrechen. Port könnte zum Beispiel 3000 sein. Sie hätten alle Prozesse abgebrochen, wenn Sie nach dem Ausführen des Befehls keine Ausgabe sehen würden

Nsoseka
quelle