วิธีปลด localhost จาก Error: ฟัง EADDRINUSE


120

ฉันกำลังทดสอบเซิร์ฟเวอร์ที่เขียนใน nodejs บน windows 7 และเมื่อฉันพยายามเรียกใช้ผู้ทดสอบในบรรทัดคำสั่งฉันได้รับข้อผิดพลาดต่อไปนี้

Error: listen EADDRINUSE
at errnoException (net.js:614:11)
at Array.0 (net.js:704:26)
at EventEmitter._tickCallback (node.js:192:40)

จะแก้ไขได้อย่างไรโดยไม่ต้องรีบูต


9
sudo killall nodeอาจจะสะดวก
Hashir Hussain

คำตอบ:


101

หมายความว่าที่อยู่ที่คุณพยายามผูกกับเซิร์ฟเวอร์ถูกใช้งานอยู่ ลองพอร์ตอื่นหรือปิดโปรแกรมโดยใช้พอร์ตนั้น


ฉันไม่พบสิ่งใดที่ใช้พอร์ต 3000 แต่การเปลี่ยนมันใช้งานได้!
Dennis

7
เนื่องจากโปรแกรมโหนดเดียวนี้เป็นเพียงสิ่งเดียวที่ใช้พอร์ต 3000 บนเครื่องของฉันจึงค่อนข้างชัดเจนว่ามีบางอย่างเกิดขึ้นเพื่อป้องกันไม่ให้อินสแตนซ์ก่อนหน้าของกระบวนการโหนดของฉันปิดลงอย่างถูกต้อง มันก็ทำงานเมื่อใช้node app.jsและหยุดมันด้วย Ctrl + C แต่เริ่มมีปัญหา EADDRINUSE หลังจากครั้งแรกที่ผมนำมาใช้npm startจึงดูเหมือนว่าการแก้ปัญหาที่แท้จริงก็จะมีการใช้งานอย่างอื่นที่ไม่ใช่ Ctrl + C npm startเพื่อปิดตัวลงหลังจากที่ใช้
David Mason

npm startสคริปต์ของคุณอาจมีมากกว่าหนึ่งโปรแกรมโหนดหรือโปรแกรมโหนดที่รันอยู่เบื้องหลังหรือโปรแกรมอาจมีโปรเซสลูกที่ใช้พอร์ตนั้น
เฟนต์

1
บ่อยครั้งที่ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากไม่มีการยุติกระบวนการโหนด แต่บางครั้งพอร์ตถูกใช้โดยกระบวนการอื่นดังนั้นจึงอาจเป็นเรื่องยากที่จะทำความเข้าใจ / ค้นหากระบวนการที่ถูกต้องโดยใช้กระบวนการอื่น ๆ WolfReporter ด้านล่างมีวิธีแก้ไขปัญหานี้อย่างถูกต้อง! stackoverflow.com/a/22875192/36975
qualbeen

6
ฉันps aux | grep nodeค้นหารหัสกระบวนการ (คอลัมน์ที่สอง) และฆ่ามันด้วยkill <pid>(ของฉันคือkill 18762)
nik_m

168

วิ่ง:

ps -ax | grep node

คุณจะได้รับสิ่งที่ต้องการ:

60778 ??         0:00.62 /usr/local/bin/node abc.js

จากนั้นทำ:

kill -9 60778

ขอบคุณ! ใช้งานได้กับเครื่องของฉัน!
olefrank

ขอบคุณ นี่คือสิ่งที่ฉันต้องการ ฉันติดตั้ง pm2 ซึ่งจะเริ่มต้นแอปโหนดโดยอัตโนมัติเมื่อปิด ฉันต้องปิดการใช้งาน pm2 เพื่อเริ่มต้นโหนดอัตโนมัติ
KlevisGjN

Works! ขอบคุณมาก
Wim den Herder

9
คุณทำบน Windows ได้อย่างไร?
William

kill -15 60778จะดีกว่ามากเพราะจะทำให้กระบวนการออกอย่างสง่างาม ( SIGTERM) แทนถ้าส่ง aSIGKILL
praj

39

บน Linux (อย่างน้อยอนุพันธ์ของ Ubuntu)

killall node

ง่ายกว่าแบบฟอร์มนี้

ps | grep <something>
kill <somepid>

ทั้งสองอย่างจะไม่ทำงานหากคุณมีเด็กกำพร้าที่ถือพอร์ต ให้ทำสิ่งนี้แทน:

netstat -punta | grep <port>

หากพอร์ตถูกยึดคุณจะเห็นสิ่งนี้:

tcp           0      0.0.0.0:<port>          0.0.0.*       LISTEN     <pid>/<parent>

ตอนนี้ฆ่าโดย pid:

kill -9 <pid>

1
สิ่งนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบที่สมบูรณ์ ในกรณีของฉันเช่นกันมันเป็นเด็กกำพร้า นี่คือสิ่งที่พวกเขาเรียกว่ากระบวนการซอมบี้หรือไม่?
Nithish Inpursuit Ofhappiness

1
แทนการที่คาดว่าจะ<pid>/<parent>ได้รับ-
ฟรานซิสราเลสโมราเลส

35

คำสั่งต่อไปนี้จะให้รายการของกระบวนการโหนดที่กำลังทำงานอยู่

ps | grep node

หากต้องการเพิ่มพอร์ตนั้นให้หยุดกระบวนการโดยใช้ดังต่อไปนี้

kill <processId>

3
คุณอาจต้องการเพิ่ม a | grep -v grepเพื่อไม่รวมgrepกระบวนการ
Garrett Hyde

6
ตามที่ผู้โพสต์ต้นฉบับเขียนว่า: "on windows 7" ... ;-)
Golo Roden

4
ทางเลือกที่ดีกว่ามากคือpidof node
Itay Grudev

pidofได้รับการติดตั้งอย่างง่ายดายสำหรับฉันบน osx ด้วย homebrewbrew install pidof
electblake

1
หากคุณใช้งานแอปพลิเคชันโหนดมากขึ้นเป็นไปได้ว่าที่อยู่นั้นถูกผูกไว้กับแอปพลิเคชันอื่น จะดีกว่าไหมหากค้นหา pid ที่ผูกไว้กับพอร์ตที่คุณพยายามเริ่มต้นใช้งาน เช่น: สำหรับ linux คุณสามารถใช้ netstat -lnptu | grep พอร์ต #. ไม่แน่ใจว่าสิ่งที่เทียบเท่าสำหรับ windows คืออะไร
ริส

31

คุณได้รับข้อผิดพลาดEADDRINUSEเนื่องจากพอร์ตที่แอปพลิเคชันของคุณต้องการใช้ถูกครอบครองโดยกระบวนการอื่น ในการปล่อยพอร์ตนี้คุณต้องยุติกระบวนการครอบครอง

เนื่องจากคุณใช้ Windowsคุณสามารถยุติกระบวนการโดยใช้พรอมต์คำสั่ง ( cmd) ด้วยcmdคุณสามารถค้นหารหัสกระบวนการ (PID) ของแอปพลิเคชันการปิดกั้น คุณจะต้องใช้ PID เพื่อยุติ / ฆ่ากระบวนการ

นี่คือคำแนะนำทีละขั้นตอน ...

  1. ค้นหากระบวนการทั้งหมดที่รันบนพอร์ตที่ระบุ (ในตัวอย่างนี้พอร์ตคือ "3000"):

    netstat -ano | หา ": 3000"

  2. netstatคำสั่งจะแสดงถึงกระบวนการทั้งหมดที่ทำงานในพอร์ตที่ระบุ ในคอลัมน์สุดท้ายของnetstatผลลัพธ์คุณจะเห็นPIDs (ในตัวอย่างนี้ PID คือ "8308") คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเฉพาะได้PIDโดยเรียกใช้คำสั่งต่อไปนี้:

    รายการงาน / fi "pid eq 8308"

  3. หากคุณต้องการยุติกระบวนการคุณสามารถทำได้โดยใช้คำสั่งต่อไปนี้โดยใช้PID(ในตัวอย่างนี้ PID คือ "8308"):

    taskkill / pid 8308 / ฉ

ภาพหน้าจอ

ใส่คำอธิบายภาพที่นี่


1
คำอธิบายที่มั่นคง
Joe Healy

19

เมื่อคุณได้รับข้อผิดพลาด Error: ฟัง EADDRINUSE

ลองรันคำสั่งเชลล์ต่อไปนี้:

netstat -a -o | grep 8080
taskkill /F /PID 6204

ฉันgrepแก้ไขสำหรับ 8080 เพราะฉันรู้ว่าเซิร์ฟเวอร์ของฉันกำลังทำงานบนพอร์ต 8080 ( staticบอกฉันเมื่อฉันเริ่มต้น: "การให้บริการ" "ที่http://127.0.0.1:8080 ") คุณอาจต้องค้นหาอื่น ท่าเรือ.


1
ในที่สุด! คำตอบที่ค้นหาตามพอร์ตแทนที่จะค้นหาตามกระบวนการ ไม่ใช่แค่โหนดเท่านั้นที่สามารถผูกพอร์ตได้!
Michael Scheper

ผมผลิตโมดูลในการตรวจสอบซึ่งใช้กระบวนการถูกล็อคพอร์ตที่เรียกว่าporthog โดยทั่วไปจะรันโค้ดด้านบน
Corey

15

สมมติว่าเซิร์ฟเวอร์ของคุณกำลังทำงานอยู่ port 3000

lsof -i tcp:3000
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    node    11716 arun   11u  IPv6 159175      0t0  TCP *:3000 (LISTEN)

หลังจากนั้นใช้ kill -9 <pid>

ในกรณีข้างต้น sudo kill -9 11716



7

วิธีแก้ปัญหาที่เป็นไปได้วิธีหนึ่งที่ใช้ได้ผลกับฉันคือเพียงแค่ปิดหน้าต่างในเบราว์เซอร์ที่ฉันมีสคริปต์" http: // localhost: 3000 / " ที่เกี่ยวข้องทำงานอยู่


ใช่หน้าต่างเบราว์เซอร์ยังคงเปิดอยู่เป็น gotcha ทั่วไปที่มีพอร์ต localhost :-)
Dave Everitt


6

เมื่อคุณได้รับข้อผิดพลาด

ข้อผิดพลาด: ฟัง EADDRINUSE

เปิดพรอมต์คำสั่งและพิมพ์คำแนะนำต่อไปนี้:

netstat -a -o | grep 8080
taskkill /F /PID** <*ur Process ID no*>

หลังจากนั้นรีสตาร์ทส่วนต่อประสานช่องว่างโทรศัพท์

หากคุณต้องการทราบว่ารหัส phonegap ใช้กระบวนการใดให้เปิด TASK MANAGER และดูที่PID ส่วนหัวของคอลัมน์และค้นหาหมายเลข PID


ฉันไม่สามารถให้ taskkill ทำงานได้ดังนั้นฉันจึงเปิดตัวจัดการงานและเพิ่ม PID และฆ่ามันที่นั่น thx
Tom Stickel

5

killall -9โหนดดังกล่าวข้างต้นซึ่งแนะนำโดย Patrick ทำงานได้ตามที่คาดไว้และแก้ปัญหาได้ แต่คุณอาจต้องการอ่านส่วนแก้ไขของคำตอบนี้เกี่ยวกับสาเหตุที่kill -9อาจไม่ใช่วิธีที่ดีที่สุด

ยิ่งไปกว่านั้นคุณอาจต้องการกำหนดเป้าหมายกระบวนการเดียวแทนที่จะฆ่ากระบวนการที่ใช้งานอยู่ทั้งหมดแบบสุ่มสี่สุ่มห้า

ในกรณีนั้นก่อนอื่นให้รับรหัสกระบวนการ (PID) ของกระบวนการที่ทำงานบนพอร์ตนั้น (พูด 8888):

lsof -i tcp:8888

สิ่งนี้จะส่งคืนสิ่งที่ต้องการ:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1

(ฟัง) จากนั้นทำ (ps - ไม่จริงโปรดอ่านต่อด้านล่าง):

kill -9 57385

4

สิ่งนี้ใช้ได้กับ Mac:

ขั้นตอนที่ 1.

sudo lsof -i tcp:3000 (or whatever port you want to kill)

คำสั่งด้านบนจะให้รหัสกระบวนการที่ถือพอร์ตอยู่

ขั้นตอนที่ 2.

Kill -9 <pid>

3

คุณสามารถเปลี่ยนพอร์ตของคุณใน app.js หรือในไฟล์กำหนดค่าโครงการของคุณ

ค่าเริ่มต้น ('พอร์ต', 80)

และเพื่อดูว่าพอร์ต 80 ถูกใช้งานอยู่หรือไม่คุณสามารถทำได้

netstat -antp | grep 80

netstat -antp | โหนด grep

คุณอาจต้องการดูว่ากระบวนการโหนดทำงานอยู่แล้วหรือไม่

ps -ef | โหนด grep

และหากคุณพบว่ามันทำงานอยู่แล้วคุณสามารถฆ่ามันได้โดยใช้

โหนด killall


1

ฉันสร้างเซิร์ฟเวอร์ 2 เครื่องฟังบนพอร์ต 8081 เดียวกันทำงานจากรหัสเดียวกันในขณะที่เรียนรู้

shud การสร้างเซิร์ฟเวอร์ครั้งที่ 1 ทำให้การสร้างเซิร์ฟเวอร์ที่ 2 ล้มเหลวด้วย EADDRINUSE

ความล่าช้าในการโทรกลับ node.js อาจเป็นสาเหตุที่ไม่ทำงานหรือการสร้างเซิร์ฟเวอร์ที่ 2 มีข้อยกเว้นและโปรแกรมออกดังนั้นเซิร์ฟเวอร์ที่ 1 จึงถูกปิดด้วย

คำแนะนำปัญหาเซิร์ฟเวอร์ 2 ฉันได้รับจาก: วิธีแก้ไขข้อผิดพลาด: ฟัง EADDRINUSE ขณะใช้ nodejs?


1

ข้อผิดพลาด: ฟัง EADDRINUSE เพื่อแก้ปัญหาใน Ubuntu ให้รันในเทอร์มินัลnetstat -nptl และหลังจากkill -9 {process-number}นี้คำสั่งนี้คือการฆ่ากระบวนการโหนดและตอนนี้คุณสามารถลองรันคำสั่ง node server.js อีกครั้ง

อดีต

ฟัง EADDRINUSE ::: 8080

netstat -nptl

tcp6 0 0 ::: 9000 ::: * LISTEN 9660 / java
tcp6 0 0 0 ::: 5800 ::: * LISTEN -
tcp6 0 0 ::: 5900 ::: * LISTEN -
tcp6 0 0 ::: 8080 :: : * LISTEN 10401 / node
tcp6 0 0 ::: 20080 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 80 ::: * LISTEN -
tcp6 0 0 ::: 22 ::: * LISTEN -
tcp6 0 0 ::: 10137 ::: * ฟัง 9660 / java

ฆ่า -9 10401


2
ผู้ใช้บอกว่ามันอยู่บน Windows บน Windows netstatได้รับพารามิเตอร์ที่แตกต่างกัน netstat -a -p tcp -b -vจะแสดงชื่อกระบวนการ
arboreal84

0

ฉันติดตั้งโหนดสีแดงบน Mac และ Raspberry Pi ของฉัน มีปัญหาเดียวกันและการทำ 'killall' ไม่ได้ช่วยอะไร เมื่อฉันปิด Raspberry Pi และรีสตาร์ทคอมพิวเตอร์มันก็ทำงานได้ดี


0

อาจเป็นไปได้ว่าคุณได้พยายามเรียกใช้คำสั่ง npm start ในสองแท็บที่แตกต่างกันคุณไม่สามารถเรียกใช้ npm start ได้เมื่อรันอยู่ในบางแท็บตรวจสอบครั้งเดียว


กรุณาให้รายละเอียดเพิ่มเติม
DeshDeep Singh

0

สำหรับใครก็ตามที่ได้ลองทำตามทั้งหมดข้างต้นแล้ว แต่ยังหากระบวนการ rouge ไม่พบให้ลองอีกครั้ง แต่อย่าลืมใส่ "sudo" ไว้หน้าคำสั่ง


0

หากคุณชอบ UI มากกว่านี้ให้ค้นหากระบวนการ Node.js ในตัวจัดการงานของ windows และฆ่ามัน




0

คุณจะต้องฆ่าพอร์ตโดยพยายามใช้คำสั่งต่อไปนี้บนเทอร์มินัล

$ sudo killall -9 nodejs

0

[แก้ไข]

มันอาจจะสายเกินไป แต่มันใช้งานได้เหมือนมีเสน่ห์

คุณต้องpm2ติดตั้ง

npm install -g pm2

ในการหยุดเซิร์ฟเวอร์ที่กำลังรันอยู่ (server.js):

pm2 stop -f server.js

0

ฉันได้แก้ไขปัญหานี้โดยเพิ่มด้านล่างในpackage.jsonของฉันเพื่อฆ่า PORT - 4000 ที่ใช้งานอยู่(ในกรณีของฉัน) ทำงานบน WSL2 / Linux / Mac

"scripts": {
    "dev": "nodemon app.js",
    "predev":"fuser -k 4000/tcp && echo 'Terminated' || echo 'Nothing was running on the PORT'",
  }

แหล่ง


-1

ในการฆ่าเซิร์ฟเวอร์โหนดก่อนอื่นให้รันคำสั่งนี้ในเทอร์มินัลของคุณ:

  1. top
  2. เปิดหน้าต่างอื่นจากนั้นคัดลอกเซิร์ฟเวอร์idจากหน้าต่างก่อนหน้า: PID number -9 kill ดังนั้นตอนนี้คุณฆ่าเซิร์ฟเวอร์โหนดของคุณแล้วลองเรียกใช้แอปของคุณอีกครั้ง

-1

ฉันใช้คำสั่งnetstat -ano | grep "portnumber"เพื่อแสดงรายการหมายเลขพอร์ต / PID สำหรับกระบวนการนั้น จากนั้นคุณสามารถใช้taskkill -f //pid 111111เพื่อฆ่ากระบวนการโดยค่าสุดท้ายคือ pid ที่คุณพบจากคำสั่งแรก

ปัญหาหนึ่งที่ฉันพบในบางครั้งคือการเกิดโหนดใหม่แม้ว่าจะฆ่ากระบวนการแล้วก็ตามดังนั้นฉันต้องใช้ตัวจัดการงานเก่าที่ดีเพื่อฆ่ากระบวนการโหนดด้วยตนเอง


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