cách giải phóng localhost khỏi Lỗi: nghe EADDRINUSE


120

tôi đang kiểm tra máy chủ được viết bằng nodejs trên windows 7 và khi tôi cố chạy trình kiểm tra trong dòng lệnh, tôi gặp lỗi sau

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

làm thế nào tôi có thể sửa nó mà không cần khởi động lại?


9
sudo killall nodecó thể có ích
Hashir Hussain

Câu trả lời:


101

Nó có nghĩa là địa chỉ bạn đang cố gắng liên kết máy chủ đang được sử dụng. Hãy thử một cổng khác hoặc đóng chương trình bằng cổng đó.


Tôi không thể tìm thấy bất kỳ thứ gì bằng cách sử dụng cổng 3000, nhưng việc thay đổi nó đã hoạt động!
Dennis

7
Vì chương trình nút đơn này là thứ duy nhất sử dụng cổng 3000 trên máy của tôi, nên có vẻ như khá rõ ràng rằng đã có điều gì đó xảy ra ngăn quá trình khởi tạo nút trước đó của tôi tắt đúng cách. Nó đã hoạt động khi tôi sử dụng node app.jsvà dừng nó bằng Ctrl + C, nhưng bắt đầu gặp sự cố EADDRINUSE sau lần đầu tiên tôi sử dụng npm start, vì vậy có vẻ như giải pháp thực sự sẽ là sử dụng thứ gì đó khác ngoài Ctrl + C để tắt sau khi sử dụng npm start.
David Mason

npm startTập lệnh của bạn có thể là nhiều hơn một chương trình nút hoặc một chương trình nút được chạy ở chế độ nền hoặc chương trình có thể có các quy trình con sử dụng cổng đó.
Fent

1
Rất thường xuyên, lỗi này xảy ra do một quá trình nút chưa được kết thúc. Nhưng đôi khi cổng được sử dụng bởi các quy trình khác, và do đó có thể khó hiểu / xác định vị trí quy trình chính xác làm mờ nó. WolfReporter dưới đây có một giải pháp chính xác cho vấn đề này! stackoverflow.com/a/22875192/36975
Qualbeen

6
Tôi đã làm ps aux | grep node, tìm id quy trình (cột thứ hai) và chỉ cần giết nó bằng kill <pid>(của tôi là kill 18762).
nik_m

168

Chạy:

ps -ax | grep node

Bạn sẽ nhận được một cái gì đó như:

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

Sau đó làm:

kill -9 60778

Cảm ơn! Hoạt động trên máy của tôi!
olefrank

Cảm ơn. Đây là những gì tôi cần. Tôi đã cài đặt pm2 ứng dụng nút tự động khởi động nào khi nó đóng. Tôi đã phải tắt pm2 để tự động khởi động nút.
KlevisGjN

Làm! Cảm ơn rất nhiều
Wim den Herder

9
Làm thế nào để bạn làm điều đó trên Windows?
William

kill -15 60778sẽ tốt hơn rất nhiều vì nó sẽ cho phép quá trình thoát một cách duyên dáng ( SIGTERM) thay vào đó nếu gửi aSIGKILL
praj

39

Trên Linux (ít nhất là các dẫn xuất Ubuntu)

killall node

dễ hơn hình thức này.

ps | grep <something>
kill <somepid>

Sẽ không hiệu quả nếu bạn có một đứa trẻ mồ côi đang giữ cảng. Thay vào đó, hãy làm điều này:

netstat -punta | grep <port>

Nếu cổng đang được giữ, bạn sẽ thấy một cái gì đó như sau:

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

Bây giờ giết bằng pid:

kill -9 <pid>

1
Đây phải được đánh dấu là câu trả lời hoàn chỉnh. Đối với trường hợp của tôi, nó là một đứa trẻ mồ côi. Đây có phải là những gì họ gọi là một quá trình zombie?
Nithish Inpursuit Ofharors,

1
Thay vì những <pid>/<parent>gì tôi mong đợi-
Francisco Corrales Morales,

35

Lệnh sau sẽ cung cấp cho bạn danh sách các tiến trình nút đang chạy.

ps | grep node

Để giải phóng cổng đó, hãy dừng quá trình bằng cách sử dụng cách sau.

kill <processId>

3
Bạn có thể muốn thêm một | grep -v grepđể loại trừ grepquy trình.
Garrett Hyde

6
Như người đăng ban đầu đã viết: "trên windows 7" ... ;-)
Golo Roden

4
Một lựa chọn tốt hơn nhiều sẽpidof node
Itay Grudev

pidofđược dễ dàng cài đặt cho tôi trên OSX với homebrewbrew install pidof
electblake

1
Nếu bạn đang chạy nhiều hơn thì chỉ các ứng dụng nút, có thể địa chỉ được liên kết với một số ứng dụng khác. Sẽ không tốt hơn nếu tìm kiếm pid được gắn với cổng mà bạn đang cố gắng khởi động? tức là: đối với linux, bạn có thể sử dụng netstat -lnptu | cổng grep #. Không chắc chắn những gì tương đương cho các cửa sổ là.
chrisst

31

Bạn đang gặp lỗi EADDRINUSEvì cổng, ứng dụng của bạn muốn sử dụng, bị chiếm bởi một quy trình khác. Để giải phóng cổng này, bạn cần phải chấm dứt quá trình chiếm đóng.

Vì bạn đang sử dụng Windows , bạn có thể kết thúc quá trình bằng cách sử dụng dấu nhắc lệnh ( cmd). Với cmdbạn có thể khám phá ID quy trình (PID) của ứng dụng chặn. Bạn sẽ cần PID để chấm dứt / kết thúc quá trình.

Đây là hướng dẫn từng bước ...

  1. Tìm tất cả các quy trình đang chạy trên một cổng được chỉ định (trong ví dụ này, Cổng là "3000"):

    netstat -ano | tìm ": 3000"

  2. Các netstatlệnh sẽ liệt kê tất cả tiến trình đang chạy trên cổng xác định. Trong cột cuối cùng của netstatkết quả, bạn có thể thấy các PIDs (trong ví dụ này, PID là "8308"). Bạn có thể tìm hiểu thêm về một cụ thể PIDbằng cách chạy lệnh sau:

    tasklist / fi "pid eq 8308"

  3. Nếu bạn muốn kết thúc một quá trình, bạn có thể thực hiện điều đó với lệnh sau bằng cách sử dụng lệnh của nó PID(trong ví dụ này, PID là "8308"):

    taskkill / pid 8308 / f

Ảnh chụp màn hình

nhập mô tả hình ảnh ở đây


1
giải thích chắc chắn.
Joe Healy

19

Khi bạn gặp lỗi Lỗi: hãy nghe EADDRINUSE,

Hãy thử chạy các lệnh shell sau:

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

Tôi đã chỉnh sửa grepcho 8080, bởi vì tôi biết máy chủ của mình đang chạy trên cổng 8080. ( staticcho tôi biết khi tôi khởi động nó: "đang phục vụ". "Tại http://127.0.0.1:8080 '.) Bạn có thể phải tìm kiếm một Hải cảng.


1
Cuối cùng! Một câu trả lời tìm kiếm theo cổng, thay vì theo quy trình. Nó không chỉ là nút có thể kết nối một cổng!
Michael Scheper

Tôi đã tạo một mô-đun để phát hiện tiến trình đang chạy nào đang khóa một cổng, được gọi là porthog . Về cơ bản, nó thực thi đoạn mã trên.
Corey

15

giả sử máy chủ của bạn đang chạy 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)

sau khi sử dụng kill -9 <pid>

trong trường hợp trên sudo kill -9 11716


12

sử dụng lệnh dưới đây để hủy một tiến trình đang chạy tại một cổng nhất định - 3000 trong ví dụ này bên dưới

kill -9 $(lsof -t -i:3000)

7

Một giải pháp khả thi phù hợp với tôi chỉ đơn giản là đóng cửa sổ trong trình duyệt nơi tôi có tập lệnh " http: // localhost: 3000 / " tương ứng đang chạy.


Yep, cửa sổ trình duyệt vẫn mở là một Gotcha chung với cổng localhost :-)
Dave Everitt

7

Kiểm tra ID quy trình

sudo lsof -i: 8081

Hơn là giết quá trình cụ thể

sudo kill -9 2925

nhập mô tả hình ảnh ở đây


6

Khi bạn gặp lỗi

Lỗi: nghe EADDRINUSE

Mở dấu nhắc lệnh và nhập các hướng dẫn sau:

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

sau đó khởi động lại giao diện khoảng cách điện thoại.

Nếu bạn muốn biết ID quy trình phonegap đang sử dụng, hãy mở TASK MANAGER và nhìn vào PID của tiêu đề cột và tìm số PID.


Tôi không thể có được taskkill để làm việc, vì vậy tôi mở task manager và thêm PID và giết chết nó ở đó thx
Tom Stickel

5

Nút nói trên killall -9, do Patrick đề xuất hoạt động như mong đợi và giải quyết được vấn đề nhưng bạn có thể muốn đọc phần chỉnh sửa của câu trả lời chính này về lý dokill -9 có thể không phải là cách tốt nhất để làm điều đó.

Trên hết, bạn có thể muốn nhắm mục tiêu một quy trình duy nhất thay vì giết chết tất cả các quy trình đang hoạt động một cách mù quáng.

Trong trường hợp đó, trước tiên hãy lấy ID tiến trình (PID) của tiến trình đang chạy trên cổng đó (giả sử 8888):

lsof -i tcp:8888

Điều này sẽ trả về một cái gì đó như:

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

(NGHE) Sau đó chỉ cần làm (ps - thực sự là không. Vui lòng tiếp tục đọc bên dưới):

kill -9 57385

4

Điều này hoạt động trên Mac:

Bước 1.

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

Lệnh trên sẽ cung cấp cho bạn (các) Id tiến trình hiện đang giữ cổng.

Bước 2.

Kill -9 <pid>

3

bạn có thể thay đổi cổng của mình trong app.js hoặc trong tệp cấu hình dự án của bạn.

default ('cổng', 80)

và để xem liệu cổng 80 đã được sử dụng hay chưa, bạn có thể làm

netstat -antp | grep 80

nút netstat -antp | grep

bạn có thể muốn xem liệu quá trình nút đã chạy hay chưa.

ps -ef | nút grep

và nếu bạn thấy nó đã chạy, bạn có thể giết nó bằng cách sử dụng

nút killall


1

Tôi đã tạo 2 máy chủ, nghe trên cùng một cổng 8081, chạy từ cùng một mã, trong khi học

Việc tạo máy chủ thứ nhất không thành công Việc tạo máy chủ thứ 2 không thành công với EADDRINUSE

node.js gọi lại chậm trễ có thể là lý do đằng sau không hoạt động hoặc tạo máy chủ thứ hai có ngoại lệ và chương trình đã thoát, vì vậy máy chủ thứ nhất cũng bị đóng

2 gợi ý vấn đề máy chủ, tôi nhận được từ: Làm thế nào để khắc phục Lỗi: nghe EADDRINUSE trong khi sử dụng nodejs?


1

Lỗi: lắng nghe EADDRINUSE để giải quyết nó trong Ubuntu chạy trong thiết bị đầu cuối netstat -nptl và sau đókill -9 {process-number} lệnh này là để giết quá trình nút và bây giờ bạn có thể thử chạy lại lệnh node server.js

Ví dụ

nghe EADDRINUSE ::: 8080

netstat -nptl

tcp6 0 0 ::: 9000 ::: * NGHE 9660 / java
tcp6 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 ::: * NGHE 9660 / java

giết -9 10401


2
Người dùng cho biết nó có trên Windows. Trên Windows netstatnhận các thông số khác nhau. netstat -a -p tcp -b -vsẽ xuất ra tên quy trình.
arboreal84

0

Tôi đã cài đặt nút đỏ trên máy Mac và Raspberry Pi của mình. Có cùng một vấn đề và thực hiện 'killall' không giúp được gì. Sau khi tôi tắt Raspberry Pi và khởi động lại máy tính của mình, nó hoạt động tốt.


0

Có thể bạn đã cố gắng chạy lệnh npm start trong hai tab khác nhau. Bạn không thể chạy npm start khi nó đã chạy trong một số tab. Hãy kiểm tra nó một lần.


Vui lòng cung cấp thêm thông tin chi tiết.
DeshDeep Singh

0

Đối với bất kỳ ai đã thử tất cả các cách trên, nhưng vẫn không thể tìm thấy quy trình rouge, hãy thử lại tất cả nhưng đảm bảo bạn bao gồm "sudo" trước các lệnh.


0

Nếu bạn thích giao diện người dùng hơn, hãy tìm quá trình Node.js trong trình quản lý tác vụ windows và giết nó.


0

ps -ef | grep node tìm app.js, diệt pid của app.js


0

chỉ cần giết nút là nút pkill -9 trong thiết bị đầu cuối của ubantu hơn là nút bắt đầu


0

Bạn sẽ cần phải hủy cổng bằng cách thử sử dụng lệnh sau trên thiết bị đầu cuối

$ sudo killall -9 nodejs

0

[ĐÃ GIẢI QUYẾT]

Có thể là quá muộn nhưng nó hoạt động như một cái duyên.

Bạn cần pm2được cài đặt

npm install -g pm2

Để dừng máy chủ đang chạy hiện tại (server.js):

pm2 stop -f server.js

0

Tôi đã giải quyết vấn đề này bằng cách thêm bên dưới vào package.json của mình để loại bỏ PORT đang hoạt động - 4000 (trong trường hợp của tôi) Chạy trên WSL2 / Linux / Mac

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

Nguồn


-1

Để giết máy chủ nút, trước tiên hãy chạy lệnh này trong thiết bị đầu cuối của bạn:

  1. top
  2. mở một cửa sổ khác, sau đó sao chép máy chủ idtừ cửa sổ trước: PID number -9 kill vì vậy bây giờ bạn đã giết máy chủ nút của mình, hãy thử lại để chạy ứng dụng của bạn.

-1

Tôi đã sử dụng lệnh netstat -ano | grep "portnumber"để liệt kê số cổng / PID cho quá trình đó. Sau đó, bạn có thể sử dụng taskkill -f //pid 111111để ngắt quá trình, giá trị cuối cùng là pid bạn tìm thấy từ lệnh đầu tiên.

Một vấn đề mà tôi gặp phải đôi khi là hồi sinh nút ngay cả sau khi giết quá trình, vì vậy tôi phải sử dụng trình quản lý tác vụ cũ tốt để giết quá trình nút theo cách thủ công.


-4

Trong cửa sổ, vui lòng thực hiện lệnh này:

taskkill /F /PID 1952

1
Năm 1952 là một biến số. Quá trình giết có thể có một ID khác.
Thiết kế bởi Adrian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.