2015-06-25 6 views
66

Ich versuche, die Rails-App mit dem Puma-Webserver zu implementieren. Beim Versuch, Puma Server mit einer Konfigurationsdatei bundle exec puma -C config/puma.rb zu starten, erhalte ich einen Fehler, dass die Adresse bereits verwendet wird.Adresse bereits verwendet - bind (2) (Errno :: EADDRINUSE)

Kann jemand das beheben?

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

es ist genau das, was es sagt. jemand benutzt bereits Port 3000. Benutzen Sie netstat, um herauszufinden, wer an Port 3000 ist. – Mircea

+1

Wenn ich versuche, es zu töten, erhalte ich den Fehler 'kill -59780 PID'. Sagt mir 'ungültige Signalspezifikation'. Ich habe 'lsof -wni tcp: 3000' verwendet, um zu zeigen, was Port 3000 benutzt. –

+1

kill -9 59780 (also" kill -9 pid_id "im Allgemeinen) – Mircea

Antwort

158

müssen Sie verwenden kill -9 59780 (lsof -wni tcp:3000 verwenden, um zu sehen, welcher Prozess 3000 Port verwendet und der Prozess pid erhalten)

oder Sie ändern einfach Ihre puma Config den TCP-Port tcp://127.0.0.1:30003000-9292 oder anderen Port ändern das wurde nicht benutzt.

oder Sie können mit

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001 
+0

hat perfekt funktioniert, danke! –

+0

danke für diese Antwort. Ich habe denselben Fehler mit OP bekommen. und was ich realisierte ist, dass ich schon 'rails s' an einem anderen Terminal mache. Deshalb habe ich diesen Fehler bekommen. dann benutzte ich diff port, um den server zu starten 'rails s -p 9090' –

65

Um den Puma Prozess zu töten erste laufen

lsof -wni tcp:3000 

zeigen Sie Ihre Rails-Anwendung starten, was Port verwendet 3000. Dann die PID verwenden, die mit der kommt Ergebnis, um den Kill-Prozess auszuführen.

Zum Beispiel nach lsof -wni tcp läuft: 3000 Sie könnte 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) 

nun folgenden zu töten den Prozess laufen bekommen. (Wo 3366 die PID)

kill -9 3366 

Sollte lösen das Problem

+0

Danke @ sawo-cliff es löste mein Problem Ich hatte eine andere Anwendung auf Port 3000. – Nomis

+3

Wie diese Antwort weitere Informationen als die vor einem Jahr angenommen? –

+1

@AndreFigueiredo, nicht ganz sicher, ich folge Ihrer Frage, aber aus dem kleinen, das ich daraus entnehmen kann, fügte meine Antwort hinzu, wie man weiß, welche Prozess-ID läuft, um zu wissen, was zu töten ist. –

0

das Skript unten in diesem github issue gefunden. Funktioniert großartig 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 letztere schaffen server_killer.rb es dann mit ruby server_killer.rb

0

Sie diesen Trick versuchen können auch laufen:

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