이미 사용중인 주소-bind (2) (Errno :: EADDRINUSE)


130

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

1
그것이 정확히 말하는 것입니다. 누군가가 이미 포트 3000을 사용하고 있습니다. netstat를 사용하여 포트 3000에있는 사용자를 확인하십시오.
Mircea

4
내가 죽이려고하면 오류가 발생 kill -59780 PID합니다. 알려줍니다 invalid signal specification. 내가 사용하는 lsof -wni tcp:3000포트 3000 사용하는 것을 보여
고넬료 윌슨

1
kill -9 59780 (일반적으로 "kill -9 pid_id")
Mircea

답변:


288

당신은 사용할 필요 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

이 답변에 감사드립니다. OP와 동일한 오류가 발생했습니다. 내가 깨달은 것은 이미 rails s다른 터미널에서하고 있다는 것입니다 . 그래서 그 오류가 발생합니다. 그런 다음 diff 포트를 사용하여 서버를 시작했습니다 rails s -p 9090
Fai Zal Dong

129

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

    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

문제를 해결해야합니다


@ sawo-cliff에게 감사합니다. 문제를 해결하여 포트 3000에서 다른 응용 프로그램을 실행했습니다.
Nomis

3
이 답변이 1 년 전에 허용 된 것보다 더 많은 정보를 어떻게 추가합니까?
Andre Figueiredo

1
@AndreFigueiredo, 확실히 귀하의 질문을 따르지 만, 조금이라도 그것을 얻을 수 있다면, 대답은 무엇을 죽일 지 알기 위해 어떤 프로세스 ID가 실행 중인지 알 수있는 방법을 추가했습니다.
Sawo Cliff

예. 원래 답변 DID에 동일한 정보가 포함되어 있음을 알 수 있습니다. 그러나이 버전을 읽을 때까지 내가해야 할 일을 완전히 이해하지 못했습니다.
Jeff Zivkovic

28

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

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

위의 예에 따라 실제로 프로세스를 종료하지 않으면 kill -9 67661if를 사용하십시오 kill 67661. 그것은 나를 위해 일했다! 건배!
윌리엄 햄프셔

3

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


이것은 나를 위해 감사했지만, 필요하지 않은 것처럼 sudo를 꺼 냈습니다.
Obromios

1

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


0

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

sudo fuser -k -n tcp port

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.