ฉันจะแก้ไขข้อผิดพลาด“ java.net.BindException: ที่อยู่ที่ใช้งานแล้ว: JVM_Bind” ได้อย่างไร


187

ใน Eclipse ฉันได้รับข้อผิดพลาดนี้:

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

ฉันไม่แน่ใจว่าทำไมถึงเกิดขึ้นตอนนี้ แต่มันก็ทำงานได้ดีเพียงไม่กี่ชั่วโมงที่ผ่านมา ฉันต้องรีสตาร์ทเครื่องหรือไม่ ฉันจะไปที่ด้านล่างของมันได้อย่างไร ฉันขอขอบคุณเคล็ดลับหรือคำแนะนำใด ๆ


1
ฉันได้เห็นสิ่งนี้บ่อยครั้งในเครื่องที่กำลังพัฒนาเมื่อคุณเรียกใช้การทดสอบโค้ด - ปัญหานี้จะหลีกเลี่ยงได้อย่างไร?
จะ

คำตอบ:


141

ใช่คุณมีกระบวนการอื่นที่ผูกไว้กับพอร์ตเดียวกัน

TCPView (Windows เท่านั้น) จากWindows Sysinternals เป็นแอพโปรดของฉันทุกครั้งที่ฉันมีข้อผิดพลาด JVM_BIND มันแสดงให้เห็นว่ากระบวนการใดที่กำลังรอฟังพอร์ตใด นอกจากนี้ยังมีเมนูบริบทที่ใช้สะดวกในการฆ่ากระบวนการหรือปิดการเชื่อมต่อที่กำลังขวางทาง


วิธีแก้ปัญหาอย่างรวดเร็ว: เปิดมุมมองเซิร์ฟเวอร์> ดับเบิลคลิกที่เซิร์ฟเวอร์> เปลี่ยนหมายเลขพอร์ตที่ใช้ (เช่นสำหรับผู้ดูแลระบบ Tomcat, HTTP / 1.1, & AJP / 1.3)
Adrien Be

2
@novice_developer netstatเป็นคำสั่งที่คุณกำลังมองหาด้วยตัวเลือก -a และ -p man netstatเป็นเพื่อนของคุณสำหรับส่วนที่เหลือ :)
sox with Monica

1
หากกระบวนการข้างต้นไม่ทำงานให้รีสตาร์ทพีซีหนึ่งครั้งฉันคิดว่ามันจะใช้งานได้ มันเริ่มทำงานในกรณีของฉัน
Kumar

195

lsof -i:<port>ถ้าคุณรู้ว่าพอร์ตกระบวนการทำงานคุณสามารถพิมพ์:

ตัวอย่างเช่นlsof -i:8080เพื่อแสดงรายการกระบวนการ (pid) ที่ทำงานบนพอร์ต 8080

จากนั้นฆ่ากระบวนการด้วย kill <pid>


4
ใช่นั่นคือลินุกซ์ จากนั้นลองใช้สิ่งที่เทียบเท่าใน Windows บางทีนี่อาจช่วยได้: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino

1
ดังนั้นฉันใช้ Raspbian และมันบอกว่า: bash: lsof: ไม่พบคำสั่ง ข้อเสนอแนะใด ๆ
Mona Jalal

1
@MonaJalal hmmm ไม่แน่ใจ แต่อาจลองอะไรเช่นนั้นsudo apt-get install lsof
กาแฟ

@DiegoPino ฉันกำลังหันหน้าไปทางข้อผิดพลาดเดียวกันjava.net.BindException: Address already in use (Bind failed) ผมใช้และได้lsof -i:8080 tcp6 0 0 :::8080 :::* LISTEN 106872/javaฉันควรทำอย่างไรดี ? ฆ่าจาวา ??
Avijit Barua

@AvijitBarua กระบวนการ id (pid) ของโปรแกรม Java ที่เชื่อมโยงกับพอร์ตนี้คือ 106872 ทุกโปรแกรม Java ที่คุณเรียกใช้แสดงตัวเป็นโปรแกรม java (เป็นเครื่องเสมือน Java ที่รันโค้ดที่คอมไพล์ของคุณ) ใช่คุณสามารถออกหรือฆ่าโปรแกรมจาวานี้ได้หากไม่ใช่เครื่องมือที่สำคัญ (ระบบ) แต่เป็นโปรแกรมของคุณเอง htopมีลักษณะในการจัดการงานเช่น บางทีคุณอาจพยายามผูกกับพอร์ตที่ใช้โดยโปรแกรมที่ถูกต้องซึ่งไม่ควรฆ่า
xuiqzy

114

ในหน้าต่าง

netstat -ano

จะแสดงรายการโปรโตคอลพอร์ตและกระบวนการรับฟังทั้งหมด ใช้

taskkill -pid "proces to kill" /f

เพื่อฆ่ากระบวนการฟังพอร์ต เช่น

 taskkill -pid 431 /f

10
netstat -ano | ค้นหา "หมายเลขพอร์ตของคุณ" ใช้สิ่งนี้บน Windows สำหรับพอร์ตที่ระบุ
BlondCode

สำหรับฉัน (ใช้ Windows 10) findไม่ทำงาน แต่findstrทำไม่ได้ netstat -ano | findstr :8080เพื่อหลีกเลี่ยงผลบวกปลอมก็ยังช่วยในย่อหน้าลำไส้ใหญ่เช่น หลังจากทำเช่นนี้ - สมมติว่าคืน PID 1234 - ถ้าคุณต้องการค้นหาชื่อของกระบวนการนี้สามารถทำได้ผ่านทางtasklist /fi "pid eq 1234"
Steve Chambers

34

ใน Mac:

ฆ่ากระบวนการ เทอร์มินัล:kill <pid>

ค้นหา pid: เทอร์มินัล:lsof -i:<port>

จากคำตอบ Diego Pino


11
kill <pid> ใช้งานไม่ได้กับ mac, kill -9 <PID> ทำงานกับฉัน
Samy Omar

33

ในUbuntu / Unixเราสามารถแก้ไขปัญหานี้ได้ 2 ขั้นตอนดังที่อธิบายไว้ด้านล่าง

  1. ชนิด netstat -plten |grep java

    สิ่งนี้จะให้ผลลัพธ์คล้ายกับ:

    tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       

    นี่8080คือหมายเลขพอร์ตที่กระบวนการจาวากำลังรับฟังและ9488เป็นรหัสกระบวนการ (pid)

  2. เพื่อปลดปล่อยพอร์ตที่ถูกครอบครองเราต้องฆ่ากระบวนการนี้โดยใช้killคำสั่ง

    kill -9 9488

    9488เป็นรหัสกระบวนการจากก่อนหน้านี้ เราใช้-9เพื่อบังคับหยุดกระบวนการ

พอร์ตของคุณควรจะว่างและคุณสามารถรีสตาร์ทเซิร์ฟเวอร์ได้


ฉันกำลังกำหนดค่าเซิร์ฟเวอร์ CentOs ในมหาสมุทรดิจิตอล ถ้าฉันฆ่ากระบวนการนี้ฉันจะเรียกใช้เซิร์ฟเวอร์ได้อย่างไร
Avijit Barua

ใช้เพียง -9 ถ้าเป็นโปรแกรมของคุณเองและคุณไม่มีข้อมูลใด ๆ ที่จะสูญเสีย มันฆ่ากระบวนการอย่างไม่สะอาด -15 บอกให้โปรแกรมออกจากตัวเอง
xuiqzy

27

(Windows เท่านั้น)

หากต้องการฆ่ากระบวนการคุณต้องค้นหารหัสกระบวนการ (pid) ก่อน

โดยการรันคำสั่ง:

netstat -ano | findstr :yourPortNumber

ดังแสดงในภาพด้านล่าง

คุณจะได้รับรหัสกระบวนการ (PID) ตอนนี้เพื่อฆ่ากระบวนการเดียวกันให้รันคำสั่งนี้:

taskkill /pid yourid /f

ป้อนคำอธิบายรูปภาพที่นี่


7

คุณมีกระบวนการอื่นที่ทำงานบนพอร์ตเดียวกัน

คุณสามารถลองฆ่าหนึ่งในบริการ java.exe ที่ทำงานในตัวจัดการงานของคุณ - ps ตรวจสอบให้แน่ใจว่าคุณไม่ได้ฆ่า eclipse เพราะนั่นแสดงเป็น java.exe เช่นกัน หากไม่มีอะไรใช้งานได้การรีสตาร์ทเครื่องของคุณจะแก้ไขได้ ดูเหมือนว่าคุณจะไม่ปิดซ็อกเก็ตจากการทดสอบก่อนหน้านี้ หวังว่านี่จะช่วยได้


6

สำหรับผู้ที่กำลังมองหาคำตอบที่ง่ายที่สุด (นั่นคือสิ่งที่เรามักจะพลาด) เพียงแค่หยุดการทำงานของคุณและเริ่มโครงการใหม่อีกครั้ง ส่วนใหญ่สิ่งที่เราทำคือเราลืมที่จะหยุดโครงการที่เราทำก่อนหน้านี้และเมื่อเราเรียกใช้โครงการอีกครั้งมันแสดงให้เห็นปัญหาดังกล่าว

ฉันกำลังแนบรูปภาพเพื่อให้ชัดเจนยิ่งขึ้น (ฉันใช้ 'ชุดเครื่องมือสปริง') ดังนั้นสิ่งที่คุณต้องทำก็คือคลิกที่ปุ่มทางขวาสุดโต่งหากคุณต้องการเปิดใช้งานโครงการเดิมอีกครั้งหรือคลิกปุ่มแรกซึ่งอยู่ที่ 2 จากขวาเพื่อหยุดโครงการของคุณจากนั้นกดปุ่มที่อยู่ทางซ้ายสุดเพื่อเรียกใช้ โครงการของคุณ ฉันหวังว่าสิ่งนี้จะแก้ปัญหาของโปรแกรมเมอร์รุ่นใหม่ไม่กี่คน :)

ป้อนคำอธิบายรูปภาพที่นี่


4

ในบรรทัด Windows CMD ค้นหา ID กระบวนการที่เก็บการเชื่อมต่อบนพอร์ตผูกโดยป้อนคำสั่งต่อไปนี้:

C:> netstat -a -o

- แสดงการเชื่อมต่อทั้งหมด

-o แสดงตัวระบุกระบวนการ

จากนั้นยุติกระบวนการ


2

ใช่อย่าง Guido Simone พูดเพราะมันเป็นกระบวนการอื่นที่ฟังพอร์ตเดียวกันถ้าคุณอยู่ใน Ubuntu คุณสามารถฆ่ากระบวนการที่ให้คำสั่ง sudo kill $(sudo lsof -t -i:[port number])

อดีต: sudo kill $(sudo lsof -t -i:8080)

แต่เมื่อมันไม่ทำงานสำหรับฉัน ฉันได้รับคำสั่ง

$ lsof -i:[port] 

และมันไม่แสดงอะไรเลย

ฉันตรวจสอบคอนเทนเนอร์นักเทียบท่าของฉันโดยใช้คำสั่ง docker ps -aแต่ไม่ใช่ภาชนะที่ยังมีชีวิตอยู่ทั้งหมดหยุดทำงาน (แต่ฉันจำได้ว่าฉันหยุดใช้หนึ่งคอนเทนเนอร์ซึ่งใช้พอร์ตเดียวกันเมื่อไม่กี่นาทีที่ผ่านมา) เพื่อให้แน่ใจว่านักเทียบท่าไม่ใช่เหตุผล กระบวนการนักเทียบท่าใช้คำสั่งsudo service docker stopแล้วลองอีกครั้ง คราสน่าแปลกใจที่ไม่ได้แสดงข้อผิดพลาดในเวลานั้นมันรันโปรแกรมของฉันอย่างสมบูรณ์แบบ

หวังว่าประสบการณ์ของฉันจะช่วยได้บ้าง



1

กระบวนการอื่นกำลังใช้พอร์ตอยู่แล้วเนื่องจาก @Diego Pino กล่าวว่าคุณสามารถใช้ lsof บนยูนิกซ์เพื่อค้นหากระบวนการและฆ่ากระบวนการที่เกี่ยวข้องหากคุณอยู่บน windows ใช้ netstat -ano เพื่อรับ pids ทั้งหมดของกระบวนการและ พอร์ตที่ทุกคนได้รับ ค้นหาพอร์ตที่คุณต้องการและฆ่า

เป็นเรื่องง่ายมากเพียงแค่รีสตาร์ทเครื่องหากเป็นไปได้ :)


1

รีสตาร์ทพีซีเมื่อฉันคิดว่ามันจะทำงาน มันเริ่มทำงานในกรณีของฉัน อีกสิ่งหนึ่งที่สามารถทำได้ไปที่ตัวจัดการงานและจบกระบวนการ

สกรีนช็อตสำหรับการอ้างอิง


กรุณาอย่าตอบด้วยความคิดเห็น / คำถาม มันจะดีกว่าถ้าคุณลบ
Clijsters

1

ในกรณีของฉัน Tomcat ทำงานในพื้นหลัง ฉันติดตั้งเป็น servlet ภายนอกขณะใช้ Eclipse ด้วย Spring Boot ใน Intellij จะมีเซิร์ฟเวอร์เป็นของตัวเอง แต่ไม่สามารถเริ่มต้นได้ในขณะที่ครอบครองอยู่แล้ว
ในกรณีของฉัน Tomcat เริ่มทำงานโดยอัตโนมัติฉันเปิดระบบปฏิบัติการของฉันนั่นคือเหตุผลที่ฉันต้องปิดระบบเอง:

$ sudo service tomcat stop

แน่นอน "Tomcat" ขึ้นอยู่กับรุ่นของ Tomcat ที่คุณใช้
หวังว่ามันจะช่วยให้ใครบางคน


0

ฉันประสบปัญหาคล้ายกันใน Eclipse เมื่อเปิดคอนโซลสองเครื่องเมื่อฉันเริ่มโปรแกรมเซิร์ฟเวอร์ก่อนจากนั้นจึงเปลี่ยนโปรแกรมไคลเอนต์ ฉันเคยหยุดโปรแกรมในคอนโซลเดียวคิดว่ามันปิดเซิร์ฟเวอร์ แต่มีเพียงลูกค้าปิดไม่ใช่เซิร์ฟเวอร์ ฉันพบว่ากำลังรันกระบวนการ Java ในตัวจัดการงานของฉัน ปัญหานี้ได้รับการแก้ไขโดยการปิดทั้งเซิร์ฟเวอร์และโปรแกรมไคลเอนต์จากแต่ละคอนโซล (Eclipse แสดงคอนโซลของโปรแกรมที่ใช้งานล่าสุด) ดังนั้นเมื่อฉันเริ่มต้นโปรแกรมเซิร์ฟเวอร์อีกครั้งพอร์ตก็เปิดขึ้นเพื่อรับการบันทึกอีกครั้ง


0

พอร์ตของคุณจะต้องไม่ว่างในกระบวนการอื่น ๆ ดังนั้นคุณสามารถดาวน์โหลด TCPView ได้ที่https://technet.microsoft.com/en-us/sysinternals/bb897437และฆ่ากระบวนการสำหรับพอร์ตที่ใช้

หากคุณไม่รู้จักพอร์ตของคุณให้ดับเบิลคลิกที่เซิร์ฟเวอร์ที่ไม่ได้เริ่มและคลิกที่เปิดหน้าคุณสมบัติเซิร์ฟเวอร์และคลิกที่ glassfish จากคอลัมน์ซ้าย คุณจะพบพอร์ตที่นี่


0

(1) ตรวจสอบพอร์ตที่ใช้งานอยู่หรือไม่ฆ่ากระบวนการนั้น

$ lsof -i: [พอร์ต]

(2) อีกเหตุผลคือพอร์ตถูกใช้โดย ipv6 การแก้ปัญหา:

แก้ไข/etc/sysctl.conf

เพิ่มลงในไฟล์

net.ipv6.conf.all.disable_ipv6 = 1

จากนั้นให้มันมีผล

$ sudo sysctl -p /etc/sysctl.conf

หรือเพียงแค่รีบูต


0

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

กำหนดค่าแอปพลิเคชันของคุณเพื่อใช้พอร์ตอื่นที่ว่างและคุณจะเห็นแอปพลิเคชันของคุณทำงาน


0

สำหรับ windows :

  1. ค้นหารหัสกระบวนการ

    netstat -nao | ค้นหา "8080"

มันจะแสดง ID กระบวนการเป็นตัวเลข

ตัวอย่าง :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

ที่นี่ 18856 เป็น ID กระบวนการ

  1. ฆ่ากระบวนการนั้น

    taskkill / PID 18856 / F

ผลลัพธ์ : สำเร็จ: กระบวนการที่มี PID 18856 ถูกยกเลิก

ที่นี่โดยใช้ taskkill คุณกำลังฆ่ารหัสกระบวนการ: 18856

สำหรับ linux / Mac :

sudo kill -9 $(sudo lsof -t -i:8080)

ที่นี่คุณจะพบกระบวนการที่ใช้sudo lsof -t -i:8080และฆ่ามันโดยคำสั่ง sudo kill

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