Adres zaten kullanımda - bind (2) (Errno :: EADDRINUSE)


130

Rails uygulamasını Puma web sunucusuyla dağıtmaya çalışıyorum. Puma sunucusunu bir yapılandırma dosyasıyla başlatmaya çalışırken bundle exec puma -C config/puma.rb, adresin zaten kullanımda olduğuna dair bir hata alıyorum.

Birisi bunu nasıl düzelteceğini biliyor mu?

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
tam olarak söylediği gibi. birisi zaten 3000 numaralı bağlantı noktasını kullanıyor. 3000 numaralı bağlantı noktasında kimin olduğunu bulmak için netstat'ı kullanın
Mircea

4
Onu öldürmeye çalıştığımda bir hata alıyorum kill -59780 PID. Bana anlatır invalid signal specification. lsof -wni tcp:30003000 numaralı bağlantı noktasının ne kullanıldığını gösterirdim.
Cornelius Wilson

1
kill -9 59780 (yani genel olarak "kill -9 pid_id")
Mircea

Yanıtlar:


288

Sen kullanımına ihtiyaç kill -9 59780ile 59780(kullanım bulundu PID numarası ile değiştirilir lsof -wni tcp:3000kullanılan işlemek görmek için 3000liman ve süreç PID olsun).

Ya da sadece puma yapılandırmanızı değiştirebilir, tcp bağlantı tcp://127.0.0.1:3000noktasını 3000yerine 9292veya kullanılmayan başka bir bağlantı noktasına değiştirebilirsiniz .

Veya aşağıdakileri kullanarak rails uygulamanızı başlatabilirsiniz:

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

bu cevap için teşekkür ederim. OP ile aynı hatayı aldım. ve fark ettiğim şey zaten rails sbaşka bir terminalde yapıyorum . İşte bu yüzden bu hatayı aldım. sonra sunucuyu başlatmak için diff portu kullandım rails s -p 9090
Fai Zal Dong

129

Puma sürecini öldürmek için ilk çalıştırın

    lsof -wni tcp:3000 

3000 numaralı bağlantı noktasını neyin kullandığını göstermek için. Sonra sonuçla birlikte gelen PID'yi kullanarak öldürme işlemini çalıştırın.

Örneğin lsof -wni tcp: 3000 çalıştırdıktan sonra şöyle bir şey elde edebilirsiniz:

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

Şimdi işlemi sonlandırmak için aşağıdakileri çalıştırın. (3366, PID'dir)

kill -9 3366

Sorunu çözmeli


Teşekkürler @ sawo-cliff, sorunumu çözdü 3000 bağlantı noktasında çalışan başka bir uygulamam vardı.
Nomis

3
Bu yanıt, bir yıl önce kabul edilenden daha fazla bilgiyi nasıl ekler?
Andre Figueiredo

1
@AndreFigueiredo, sorunuzu takip ettiğimden tam olarak emin değilim, ancak ondan anlayabildiğim kadarıyla, cevabım, neyi öldüreceğimi bilmek için hangi işlem kimliğinin çalıştığını nasıl bileceğimi ekledi.
Sawo Cliff

Evet. Şimdi, orijinal yanıtın aynı bilgileri içerdiğini görebiliyorum. Ancak bu versiyonu okuyana kadar ne yapmam gerektiğini tam olarak anlamadım.
Jeff Zivkovic

28

şu numarayı da deneyebilirsiniz:

ps aux | grep puma

örnek çıktı:

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]

sonra:

kill 67661

Kullan kill -9 67661eğer kill 67661gerçekten (örneğin yukarıda göre) sizin için süreci öldürmez. Bu benim için çalıştı! Şerefe!
William Hampshire

3

Bu github sayısında aşağıdaki komut dosyasını buldum . Benim için harika çalışıyor.

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

Ya irb içinde ya da bir Ruby dosyası içinde çalıştırabilirsiniz.

İkincisi için, oluşturun ve server_killer.rbardından çalıştırınruby server_killer.rb


Bu benim için çalıştı teşekkür ederim, ama ihtiyacım yok gibi göründüğü için sudoyu çıkardım.
Obromios

1

Çalışan işlemleri bulabilir ve öldürebilirsiniz: ps aux | grep puma Daha sonrakill PID


0

Yukarıdaki çözümler ubuntu / linux üzerinde çalışmazsa, bunu deneyebilirsiniz.

sudo fuser -k -n tcp port

Seçtiğiniz bağlantı noktasında işlemleri sonlandırmak için birkaç kez çalıştırın. bağlantı noktası örneğin 3000 olabilir. Komutu çalıştırdıktan sonra hiçbir çıktı görmezseniz tüm işlemleri sonlandırırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.