Alamat sudah digunakan - bind (2) (Errno :: EADDRINUSE)

130

Saya mencoba menggunakan aplikasi Rails dengan server web Puma. Ketika mencoba memulai server Puma dengan file konfigurasi bundle exec puma -C config/puma.rbsaya mendapatkan kesalahan bahwa alamat sudah digunakan.

Apakah ada yang tahu cara memperbaikinya?

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>'
Cornelius Wilson
sumber
1
persis seperti yang dikatakannya. seseorang sudah menggunakan port 3000. gunakan netstat untuk mencari tahu siapa yang ada di port 3000
Mircea
4
Ketika saya mencoba membunuhnya, saya mendapatkan kesalahan kill -59780 PID. Katakan padaku invalid signal specification. Saya dulu lsof -wni tcp:3000menunjukkan apa yang menggunakan port 3000.
Cornelius Wilson
1
kill -9 59780 (jadi "kill -9 pid_id" secara umum)
Mircea

Jawaban:

288

Anda perlu menggunakan kill -9 59780dengan 59780mengganti dengan nomor PID yang ditemukan (gunakan lsof -wni tcp:3000untuk melihat proses 3000port mana yang digunakan dan mendapatkan proses PID).

Atau Anda bisa memodifikasi puma config Anda untuk mengubah port tcp tcp://127.0.0.1:3000dari 3000menjadi9292 atau port lain yang tidak digunakan.

Atau Anda dapat memulai aplikasi rel Anda dengan menggunakan:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Zoker
sumber
terima kasih atas jawaban ini. Saya mendapat kesalahan yang sama dengan OP. dan apa yang saya sadari adalah saya sudah melakukannya rails sdi terminal lain. Jadi itu sebabnya saya mendapat kesalahan itu. kemudian saya menggunakan port diff untuk memulai server rails s -p 9090
Fai Zal Dong
129

Untuk membunuh proses puma jalankan terlebih dahulu

    lsof -wni tcp:3000 

untuk menunjukkan apa yang menggunakan port 3000. Kemudian gunakan PID yang datang dengan hasil untuk menjalankan proses kill.

Sebagai contoh setelah menjalankan lsof -wni tcp: 3000 Anda mungkin mendapatkan sesuatu seperti

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

Sekarang jalankan yang berikut untuk mematikan prosesnya. (di mana 3366 adalah PID)

kill -9 3366

Haruskah menyelesaikan masalah

Tebing Sawo
sumber
Terima kasih @ sawo-cliff, itu menyelesaikan masalah saya, saya punya aplikasi lain yang berjalan pada port 3000.
Nomis
3
Bagaimana jawaban ini menambahkan lebih banyak informasi daripada yang diterima satu tahun yang lalu?
Andre Figueiredo
1
@AndreFigueiredo, tidak yakin saya mengikuti pertanyaan Anda, tetapi dari sedikit yang dapat saya kumpulkan darinya, jawaban saya menambahkan cara mengetahui proses id yang sedang berjalan sehingga tahu apa yang harus dibunuh.
Tebing Sawo
Iya. Saya dapat melihat sekarang bahwa jawaban awal TIDAK termasuk informasi yang sama. Tetapi saya tidak sepenuhnya mengerti apa yang perlu saya lakukan sampai saya membaca versi ini.
Jeff Zivkovic
28

Anda juga dapat mencoba trik ini:

ps aux | grep puma

output sampel:

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]

kemudian:

kill 67661
ana
sumber
Gunakan kill -9 67661jika kill 67661tidak benar-benar mematikan proses untuk Anda (seperti contoh di atas). Itu berhasil bagi saya! Bersulang!
William Hampshire
3

Ditemukan skrip di bawah ini dalam masalah github ini . Bekerja bagus untukku.

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

Anda dapat menjalankannya di irb atau di dalam file ruby.

Untuk yang terakhir, buat server_killer.rblalu jalankan denganruby server_killer.rb

Flavio Wuensche
sumber
Ini bekerja untuk saya, terima kasih, tetapi saya mengeluarkan sudo, karena saya sepertinya tidak membutuhkannya.
Obromios
1

Anda dapat menemukan dan mematikan proses yang sedang berjalan: ps aux | grep puma Kemudian Anda dapat membunuhnya dengankill PID

Ali
sumber
0

Jika solusi di atas tidak berfungsi di ubuntu / linux maka Anda dapat mencoba ini

sudo fuser -k -n tcp port

Jalankan beberapa kali untuk mematikan proses pada port pilihan Anda. port bisa 3000 misalnya. Anda akan membunuh semua proses jika Anda tidak melihat hasil setelah menjalankan perintah

Nsoseka
sumber