Địa chỉ đã được sử dụng - liên kết (2) (Errno :: EADDRINUSE)


130

Tôi đang cố gắng triển khai ứng dụng Rails với máy chủ web Puma. Khi cố gắng khởi động máy chủ Puma bằng tệp cấu hình, bundle exec puma -C config/puma.rbtôi gặp lỗi rằng địa chỉ này đã được sử dụng.

Có ai biết làm thế nào để khắc phục điều này?

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
nó chính xác như những gì nó nói. ai đó đã sử dụng cổng 3000. sử dụng netstat để tìm ra ai đang ở trên cổng 3000
Mircea

4
Khi tôi cố giết nó, tôi gặp lỗi kill -59780 PID. Nói cho tôi biết invalid signal specification. Tôi đã từng lsof -wni tcp:3000hiển thị những gì đang sử dụng cổng 3000.
Cornelius Wilson

1
giết -9 59780 (nói chung là "giết -9 pid_id")
Mircea

Câu trả lời:


288

Bạn cần phải sử dụng kill -9 59780với 59780thay thế bằng tìm thấy số PID (sử dụng lsof -wni tcp:3000để xem quá trình sử dụng 3000cổng và nhận được quá trình PID).

Hoặc bạn chỉ có thể sửa đổi cấu hình puma của mình thay đổi cổng tcp tcp://127.0.0.1:3000từ 3000sang 9292hoặc cổng khác không được sử dụng.

Hoặc bạn có thể bắt đầu ứng dụng rails của mình bằng cách sử dụng:

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

cảm ơn vì câu trả lời này Tôi gặp lỗi tương tự với OP. và những gì tôi nhận ra là tôi đã làm rails sở một nhà ga khác. Vì vậy, đó là lý do tại sao tôi nhận được lỗi đó. sau đó tôi sử dụng cổng diff để khởi động máy chủ rails s -p 9090
Fai Zal Dong

129

Để tiêu diệt quá trình puma trước tiên hãy chạy

    lsof -wni tcp:3000 

để hiển thị những gì đang sử dụng cổng 3000. Sau đó, sử dụng bộ vi xử lý đi kèm với kết quả để chạy quá trình tiêu diệt.

Ví dụ: sau khi chạy lsof -wni tcp: 3000 bạn có thể nhận được một cái gì đó như

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

Bây giờ chạy sau đây để giết quá trình. (trong đó 3366 là PID)

kill -9 3366

Nên giải quyết vấn đề


Cảm ơn @ sawo-cliff nó đã giải quyết vấn đề của tôi Tôi đã có một ứng dụng khác chạy trên cổng 3000.
Nomis

3
Làm thế nào câu trả lời này thêm nhiều thông tin hơn so với một năm trước được chấp nhận?
Andre Figueiredo

1
@AndreFigueiredo, tôi không chắc lắm về câu hỏi của bạn, nhưng từ nhỏ tôi có thể lượm lặt được từ nó, câu trả lời của tôi đã thêm vào làm thế nào để biết id quá trình nào đang chạy để biết nên giết cái gì.
Sawo Cliff

Đúng. Bây giờ tôi có thể thấy rằng câu trả lời ban đầu DID bao gồm cùng một thông tin. Nhưng tôi đã không hoàn toàn hiểu những gì tôi cần làm cho đến khi tôi đọc phiên bản này.
Jeff Zivkovic

28

bạn cũng có thể thử mẹo này:

ps aux | grep puma

đầu ra mẫu:

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]

sau đó:

kill 67661

Sử dụng kill -9 67661nếu kill 67661không thực sự giết quá trình cho bạn (theo ví dụ trên). Điều đó đã làm việc cho tôi! Chúc mừng!
William Hampshire

3

Tìm thấy đoạn script dưới đây trong vấn đề github này . Làm việc tuyệt vời cho tôi.

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

Bạn có thể chạy nó trong irb hoặc bên trong một tập tin ruby.

Đối với cái sau, tạo server_killer.rbrồi chạy nó vớiruby server_killer.rb


Điều này làm việc cho tôi cảm ơn bạn, nhưng tôi đã lấy ra sudo, vì tôi dường như không cần nó.
Obromios

1

Bạn có thể tìm và giết các tiến trình đang chạy: ps aux | grep puma Sau đó, bạn có thể giết nó bằngkill PID


0

Nếu các giải pháp trên không hoạt động trên Ubuntu / linux thì bạn có thể thử cách này

sudo fuser -k -n tcp port

Chạy nó nhiều lần để giết các tiến trình trên cổng bạn chọn. cổng có thể là 3000 chẳng hạn. Bạn sẽ giết tất cả các tiến trình nếu bạn không thấy đầu ra sau khi chạy lệnh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.