[ruby-on-rails] 이미 사용중인 주소-bind (2) (Errno :: EADDRINUSE)

Puma 웹 서버와 함께 Rails 앱을 배포하려고합니다. 구성 파일로 Puma 서버를 시작하려고 할 때 bundle exec puma -C config/puma.rb주소가 이미 사용 중이라는 오류가 발생합니다.

누군가이 문제를 해결하는 방법을 알고 있습니까?

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



답변

당신은 사용할 필요 kill -9 5978059780발견 PID 번호 (사용으로 대체 lsof -wni tcp:3000사용 같이 처리하는 볼3000 포트를 프로세스 PID를 얻을).

또는 푸마 구성을 수정하여 tcp 포트 tcp://127.0.0.1:30003000에서9292 사용하지 않은 다른 포트 .

또는 다음을 사용하여 rails 앱을 시작할 수 있습니다.

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


답변

퓨마 프로세스를 먼저 종료하려면

    lsof -wni tcp:3000 

포트 3000을 사용하는 것을 보여줍니다. 그런 다음 결과와 함께 제공되는 PID를 사용하여 강제 종료 프로세스를 실행하십시오.

예를 들어 lsof -wni tcp : 3000을 실행 한 후

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

이제 다음을 실행하여 프로세스를 종료하십시오. (여기서 3366은 PID입니다)

kill -9 3366

문제를 해결해야합니다


답변

이 트릭을 시도해 볼 수도 있습니다.

ps aux | grep puma

샘플 출력 :

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]

그때:

kill 67661


답변

github 문제 에서 아래 스크립트를 찾았습니다 . 나를 위해 잘 작동합니다.

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

irb 또는 루비 파일 내에서 실행할 수 있습니다.

후자의 경우 server_killer.rb다음을 사용 하여 실행하십시오.ruby server_killer.rb


답변

당신은 실행중인 프로세스를 찾아 죽일 수 : ps aux | grep puma
그럼 당신은 그것을 죽일 수kill PID


답변

위의 솔루션이 우분투 / 리눅스에서 작동하지 않으면 이것을 시도 할 수 있습니다

sudo fuser -k -n tcp port

선택한 포트에서 프로세스를 종료하려면 여러 번 실행하십시오. 예를 들어 포트는 3000이 될 수 있습니다. 명령을 실행 한 후 출력이 표시되지 않으면 모든 프로세스를 종료했을 것입니다


답변