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 59780
로 59780
발견 PID 번호 (사용으로 대체 lsof -wni tcp:3000
사용 같이 처리하는 볼3000
포트를 프로세스 PID를 얻을).
또는 푸마 구성을 수정하여 tcp 포트 tcp://127.0.0.1:3000
를 3000
에서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이 될 수 있습니다. 명령을 실행 한 후 출력이 표시되지 않으면 모든 프로세스를 종료했을 것입니다