มีการใช้ที่อยู่ - ผูก (2) (Errno :: EADDRINUSE)


130

ฉันกำลังพยายามปรับใช้แอพ Rails กับเว็บเซิร์ฟเวอร์ Puma เมื่อพยายามเริ่มต้นเซิร์ฟเวอร์ 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
เมอร์เซี

4
kill -59780 PIDเมื่อฉันพยายามที่จะฆ่ามันฉันได้รับข้อผิดพลาด invalid signal specificationบอกฉัน ฉันเคยlsof -wni tcp:3000แสดงสิ่งที่ใช้พอร์ต 3000
คอร์เนเลียสวิลสัน

1
kill -9 59780 (ดังนั้น "kill -9 pid_id" โดยทั่วไป)
Mircea

คำตอบ:


288

คุณต้องใช้kill -9 59780กับ59780แทนที่ด้วยหมายเลข PID ที่พบ (ใช้lsof -wni tcp:3000เพื่อดูว่ากระบวนการใดใช้3000พอร์ตและรับ PID กระบวนการ)

หรือคุณสามารถแก้ไข puma config ของคุณเปลี่ยนพอร์ต tcp tcp://127.0.0.1:3000จาก3000เป็น9292หรือพอร์ตอื่นที่ไม่ได้ใช้

หรือคุณสามารถเริ่มแอพทางรถไฟของคุณโดยใช้:

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

หากต้องการฆ่ากระบวนการ puma ให้รันก่อน

    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
คำตอบนี้เพิ่มข้อมูลมากกว่าที่ได้รับเมื่อหนึ่งปีที่แล้วได้อย่างไร?
Andre Figueiredo

1
@ AndreFigueiredo ไม่แน่ใจว่าฉันทำตามคำถามของคุณ แต่จากเล็ก ๆ น้อย ๆ ที่ฉันสามารถรวบรวมได้จากคำตอบของฉันเพิ่มวิธีการรู้ว่ากระบวนการ id กำลังทำงานอยู่เพื่อรู้ว่าจะฆ่าอะไร
Sawo Cliff

ใช่. ฉันสามารถเห็นได้ในขณะนี้ว่าคำตอบเดิมรวมถึงข้อมูลเดียวกัน แต่ฉันไม่เข้าใจสิ่งที่ฉันต้องทำจนกว่าฉันจะอ่านเวอร์ชันนี้
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 67661ถ้าkill 67661ไม่ได้ฆ่ากระบวนการสำหรับคุณ (ตามตัวอย่างด้านบน) ที่ทำงานให้ฉัน! ไชโย!
William Hampshire

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

หากวิธีการด้านบนใช้ไม่ได้กับ ubuntu / linux คุณสามารถลองได้

sudo fuser -k -n tcp port

เรียกใช้หลาย ๆ ครั้งเพื่อฆ่ากระบวนการในพอร์ตที่คุณเลือก พอร์ตอาจเป็น 3000 ตัวอย่างเช่น คุณจะฆ่ากระบวนการทั้งหมดหากคุณไม่เห็นผลลัพธ์หลังจากเรียกใช้คำสั่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.