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.rb
się 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>'
ruby-on-rails
puma
Cornelius Wilson
źródło
źródło
kill -59780 PID
. Mówi miinvalid signal specification
. Kiedyślsof -wni tcp:3000
pokazywałem, co używa portu 3000.Odpowiedzi:
Musisz użyć
kill -9 59780
z59780
zastąpionym znalezionym numerem PID (użyj,lsof -wni tcp:3000
aby zobaczyć, który proces używał3000
portu i uzyskać PID procesu).Lub możesz po prostu zmodyfikować konfigurację puma, zmienić port TCP
tcp://127.0.0.1:3000
z3000
na9292
lub 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
źródło
rails s
na innym terminalu. Dlatego właśnie otrzymałem ten błąd. następnie użyłem portu diff do uruchomienia serwerarails s -p 9090
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
źródło
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
źródło
kill -9 67661
ifkill 67661
faktycznie nie zabije procesu za Ciebie (jak w powyższym przykładzie). To zadziałało dla mnie! Twoje zdrowie!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.rb
a następnie uruchom zruby server_killer.rb
źródło
Możesz znaleźć i zabić uruchomione procesy:
ps aux | grep puma
Następnie możesz je zabićkill PID
źródło
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
źródło
Może jest stary, ale w moim przypadku był to spowodowane dockerem. Mam nadzieję, że pomoże to innym.
źródło