Nút / Express: EADDRINUSE, Địa chỉ đã được sử dụng - Giết máy chủ


442

Tôi có một máy chủ đơn giản đang chạy trong node.js bằng kết nối:

var server = require('connect').createServer();
//actions...
server.listen(3000);

Trong mã của tôi, tôi có các trình xử lý thực tế, nhưng đó là ý tưởng cơ bản. Vấn đề tôi tiếp tục nhận được là

EADDRINUSE, Address already in use

Tôi nhận được lỗi này khi chạy lại ứng dụng của mình sau khi nó bị lỗi hoặc lỗi trước đó. Vì tôi không mở một phiên bản mới của thiết bị đầu cuối, tôi kết thúc quá trình với ctr + z.

Tôi khá chắc chắn tất cả những gì tôi phải làm là đóng máy chủ hoặc kết nối. Tôi đã thử gọi server.close()vào process.on('exit', ...);mà không có may mắn.


39
Trên thực tế, thay vì Ctrl + zbạn nên sử dụng Ctrl + csẽ đóng chương trình một cách chính xác bằng cách gửi SIGQUIT :) Xem wiki để biết thêm chi tiết :)
nacho4d

1
Bạn có nghĩa là SIGINT. SIGQUIT là do `ctrl + \`
Xedecimal

53
Hãy thử pkill nodejshoặc pkill nodenếu trên hệ điều hành giống như UNIX
Gerard

1
Tôi gặp vấn đề tương tự và thấy gói này sẽ cho phép bạn thoát sạch khi bạn CTRL + C: npmjs.com/package/exit-hook
Jazzy

1
1 cổng 10000 mà không khởi động lại máy chủ.
abksharma

Câu trả lời:


146

process.on('exit', ..)không được gọi nếu quá trình gặp sự cố hoặc bị giết. Nó chỉ được gọi khi vòng lặp sự kiện kết thúc và vì server.close() loại kết thúc vòng lặp sự kiện (nó vẫn phải chờ các ngăn xếp hiện đang chạy ở đây và ở đó) nên không có ý nghĩa gì khi đặt nó vào bên trong sự kiện thoát ...

Khi gặp sự cố, làm process.on('uncaughtException', ..)và giếtprocess.on('SIGTERM', ..)

Điều đó đang được nói, SIGTERM (tín hiệu tắt mặc định) cho phép ứng dụng dọn sạch, trong khi SIGKILL (chấm dứt ngay lập tức) sẽ không để ứng dụng làm bất cứ điều gì.


3
đó cũng là cái móc hữu ích trên process.on ('SIGINT', ...)
farincz

487

Bạn cũng có thể đi theo tuyến đường lệnh:

ps aux | grep node

để có được id quá trình.

Sau đó:

kill -9 PID

Thực hiện -9 khi kill sẽ gửi SIGKILL (thay vì SIGTERM). SIGTERM đôi khi đã bị bỏ qua bởi nút.


1
ps aux | grep nodekhông cho thấy gì; vẫn textareaserver --editor-cmd='gvim -f'không thành công: 14/03/2016 19:30 - socket.io đã sẵn sàng - chấp nhận kết nối Hiện có thể khởi động máy chủ: EADDRINUSE, Địa chỉ đã được sử dụng
Jean Jordaan

75
Tại sao điều này chứ không phảikillall -9 node
Martin Josefsson

1
pidofcũng tiện dụng
JVE999

25
Tôi đã sử dụng câu trả lời này trong một thời gian dài, sau đó một ngày đã đưa nó vào một lớp lót để thuận tiện .. lệnh này sẽ giết bất kỳ quá trình nào chạy trên một cổng nhất định (8000 trong ví dụ này): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
Tôi đã có nhiều máy chủ nút chạy cùng một lúc, một số trong số đó là các ứng dụng Electron. Tôi đã phải sử dụng chỉ killvới id quá trình cụ thể thay vì killall.
tuliomir

225

Trước tiên, bạn sẽ muốn biết quá trình đang sử dụng port 3000

sudo lsof -i :3000

điều này sẽ liệt kê tất cả các phần nghe của PID trên cổng này, khi bạn có bộ PID, bạn có thể kết thúc nó bằng cách sau:

kill -9 {PID}

17
Lệnh này xác định rõ ràng PID không giống như đầu ra của ps aux | grep nodetôi. Tôi cũng không cầnsudo
Phil Gibbins

Đây là câu trả lời tốt nhất. Làm việc tốt với tôi với cổng 8081, sử dụng React Native với sợi.
Fernando Barbosa

Nó hiệu quả tuyệt vời đối với tôi. Tôi có thể xác định nơi cổng 3000 được sử dụng và đóng nó lại. Tôi cũng không cần sudo.
Campalo

Rất tốt. Tôi cũng đã cố gắng sau khi nhận được lệnh killall -9 {COMMAND}ví dụkillall -9 node
STREET TIỀN

wow nó làm việc cho tôi
Anoop PS

162

Tôi nhấn cái này trên laptop chạy win8. cái này hiệu quả

Chạy cmd.exe với tư cách là 'Quản trị viên':

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Tôi đang chạy nó từ Cửa sổ chỉ huy và vô tình đóng nó lại. Nút vẫn tiếp tục chạy ở mặt sau ... (ngay cả sau khi phiên kết thúc). Trong trường hợp của tôi, một khi tôi đã đóng tab trình duyệt được kết nối với nó thông qua các ổ cắm web thì cuối cùng nó cũng chấm dứt.
Bertus Kruger

6
taskkill /F /IM node.exehoạt động như một cơ duyên đối với tôi trên Windows từ bất kỳ thư mục nào :-) Cảm ơn bạn đã chia sẻ !!
Marty McGee

2
Đây là giải pháp làm việc một dòng duy nhất tôi có thể xác minh cho các cửa sổ
Code Whisperer

4
Hoạt động trên windows 10. Tôi không phải chạy cmd.exe với tư cách quản trị viên btw.
Glenn Werner

74

Kiểm tra PID tức là id của tiến trình đang chạy trên cổng 3000 bằng lệnh bên dưới:

lsof -i tcp:3000

Nó sẽ xuất ra một cái gì đó như sau:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Bây giờ giết quá trình bằng cách sử dụng:

kill -9 5805

Điều này làm việc cho tôi khi sử dụng plugin ngoại tuyến sls.
Junique Atique

Cám ơn vì cái này! Tôi chỉ bắt đầu học phản ứng, như nhiều giờ trước. :) Sau khi dừng máy chủ, tôi chạy lại nó, chỉ gặp phải những lỗi như vậy.
Glenn

Tôi không nhận được đầu ra nếu tôi sử dụng bị mất. Điều này có nghĩa là không có quá trình trên phần đó?
x89


29

Linux

Chạy psvà xác định PID của quá trình nút của bạn.

Sau đó chạy sudo kill PID

các cửa sổ

Sử dụng danh sách tác vụ để hiển thị danh sách các quy trình đang chạy:

tasklist /O

Sau đó, tiêu diệt quá trình nút như vậy (sử dụng PID thu được từ tasklistlệnh):

taskkill /pid PID

1
Và nếu trên Windows?
Trevor

1
Cũng như một ghi chú ... vì một số lý do, tôi đã phải sử dụng dấu gạch chéo kép trên các cờ của mình cho lệnh taskkill từ git-bash: taskkill //IM node.exe và tôi vừa giết nút. đã làm việc.
nawlbergs

23

Đây là một lớp lót (thay thế 3000 bằng một cổng hoặc biến cấu hình):

kill $(lsof -t -i:3000)

20

Tôi đã nhận được lỗi này một lần và thực hiện nhiều phương pháp ở đây.

Vấn đề của tôi là tôi đã có hai app.listen(3000);cuộc gọi trong cùng một tập lệnh app.js. Ứng dụng đầu tiên.listen () đã thành công khi lần thứ hai ném lỗi.

Một lệnh hữu ích khác mà tôi đã tìm thấy giúp tôi gỡ lỗi là sudo fuser -k 3000/tcpnó sẽ giết bất kỳ quy trình giả mạo nào bạn có thể đã bắt đầu (một số quy trình có thể khởi động lại, ví dụ: nếu chạy với ever.js, nhưng nó hữu ích cho tôi).


cùng một vấn đề ở đây ... kỳ lạ rằng nó đã được làm việc trong đúng cách gỡ rối khi nhận được lỗi này để chạynpm start
Asqan

16

Đối với các cửa sổ mở Trình quản lý tác vụ và tìm các quy trình node.exe. Giết tất cả bọn chúng bằng End Nhiệm vụ.

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


1
quá dễ dàng và không phức tạp đối với người dùng windows
momal

Nó hoạt động. Cảm ơn
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

Sự miêu tả:


  1. ps sẽ đưa ra trạng thái quy trình, cung cấp danh sách a: tất cả các quy trình người dùng, u: quy trình riêng của người dùng, x: tất cả các quy trình khác không được gắn vào thiết bị đầu cuối.
  2. ký hiệu ống: | sẽ vượt qua kết quả của ps aux để thao tác hơn nữa.
  3. grep sẽ tìm kiếm chuỗi được cung cấp (nút trong trường hợp của chúng tôi) từ danh sách được cung cấp bởi ps aux.

12

FYI, bạn có thể giết quá trình trong một lệnh sudo fuser -k 3000/tcp. Điều này có thể được thực hiện cho tất cả các cổng khác như 8000, 8080 hoặc 9000 thường được sử dụng để phát triển.



11

Trước tiên hãy tìm hiểu những gì đang chạy bằng cách sử dụng:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

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

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Sau đó, bạn có thể giết quá trình như sau:

sudo kill 110

Sau đó, bạn sẽ có thể chạy mà không cần nghe EADDRINUSE ::: 3000 lỗi


Tôi đang sử dụng gật đầu và nó khởi động lại dịch vụ một lần nữa. Có cách nào để giết nốt?
Smit Patel

10

Đối với Visual Studio Noobs như tôi

Bạn có thể đang chạy quá trình trong các thiết bị đầu cuối khác!

Sau khi đóng thiết bị đầu cuối trong Visual Studio , thiết bị đầu cuối sẽ biến mất .

Tôi tự tạo một cái mới với suy nghĩ rằng cái trước đó đã bị phá hủy. Trong thực tế, mỗi lần tôi nhấp vào Thiết bị đầu cuối mới, tôi thực sự đang tạo một cái mới trên đầu trang trước đó .

Vì vậy, tôi đã đặt thiết bị đầu cuối đầu tiên và ... Voila, tôi đang chạy máy chủ ở đó.

nhiều thiết bị đầu cuối không thực hiện nó


1
Oh yeah anh trai của tôi.
Jaydeep Shil

8

Trình quản lý tác vụ (ctrl + alt + del) ->

Tab quy trình ->

chọn quá trình "node.exe" và nhấn "Kết thúc quá trình"


tại sao giết toàn bộ quá trình nút nếu điều đang tìm là giết quá trình cổng nút.
Jimmy Obonyo Abor

8

Bạn có thể gặp phải các tình huống trong đó thậm chí giết chết luồng hoặc quá trình sẽ không thực sự chấm dứt ứng dụng (điều này xảy ra với tôi trên Linux và Windows mỗi lần). Đôi khi bạn có thể đã có một phiên bản đang chạy mà bạn không đóng.

Do những tình huống đó, tôi thích thêm vào package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Sau đó tôi có thể gọi họ bằng cách sử dụng:

npm run stop-win
npm run stop-Linux

Bạn có thể lấy fancier và tạo các lệnh BIN đó bằng cờ đối số nếu bạn muốn. Bạn cũng có thể thêm chúng dưới dạng các lệnh sẽ được thực thi trong mệnh đề try-Catch.


5

Trong cửa sổ người dùng: mở task managerend taskcác nodejs.exetập tin, Nó hoạt động tốt.


4

Bạn có thể sử dụng nút nóng để ngăn máy chủ của bạn gặp sự cố / lỗi thời gian chạy. Nút nóng tự động khởi động lại ứng dụng nodejs cho bạn bất cứ khi nào có thay đổi trong chương trình nút [nguồn] / process [chạy chương trình nút].

Cài đặt nút nóng bằng cách sử dụng npm bằng tùy chọn chung:

cài đặt npm -g hotnode


pm2 là một lựa chọn tốt hơn. mạnh mẽ hơn, nhiều lựa chọn hơn. và không có vấn đề khi chạy root mà mãi mãi có.
Lucas

@Lucas Vấn đề gốc này mãi mãi mà bạn nói đến là gì? Tôi không may bị buộc phải sử dụng mãi mãi thay vì pm2 trên một sản phẩm tại nơi làm việc (do một số crap cấp phép), và điều này làm tôi lo lắng rất nhiều!
GPX

4

Với sự tôn trọng đối với tất cả các câu trả lời trong mẫu, tôi muốn thêm một điểm.

Tôi thấy rằng khi tôi chấm dứt một ứng dụng nút bị lỗi bằng cách sử dụng Ctrl + Z, thì lần tiếp theo khi tôi cố mở nó cũng gặp lỗi tương tự EADDRINUSE.

Khi tôi sử dụng Ctrl + C để chấm dứt một ứng dụng nút, lần sau khi tôi mở nó, nó đã làm mà không gặp trở ngại nào.

Thay đổi số cổng thành một cái gì đó không phải là lỗi đã giải quyết vấn đề.


1
Ctrl + C là chính xác. Tôi đã sử dụng cùng số cổng như trước đây và nó hoạt động như trước đây.
vipulnj

2
<key> Ctrl-Z </ key> không dừng quá trình. Nó đặt nó trong nền để bạn có thể chạy các lệnh khác. Đây là một thứ shell Unix. Để tiếp tục quá trình sử dụng fgtrong cùng bàn điều khiển. Sau đó, bạn có thể thấy những gì đang xảy ra trong máy chủ đó sau khi đã nhập nhiều lệnh khác nhau trong dòng lệnh.
Alexis Wilke

4

Trên Linux.

Thêm chức năng vào ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Thay đổi kéo: source ~/.bashrc

Và sử dụng nó: killTcpListen 3000


3

Chỉ trong trường hợp kiểm tra nếu bạn đã thêm dòng này nhiều lần do nhầm lẫn

app.listen(3000, function() {
  console.log('listening on 3000')
});

Đoạn mã trên là để thể hiện nhưng chỉ cần kiểm tra xem bạn có đang cố gắng sử dụng cùng một cổng hai lần trong mã của mình không.


3

Win10, git bash v2.15, nút v8.9.1, npm v5.5.1

Tôi đã có một tập lệnh pack.json để bắt đầu nút: "start": "node index.js"

Bất cứ khi nào tôi sử dụng nó, bất kể tôi đã giết nó bằng ctrl + c, tôi đều gặp phải vấn đề này.

Nếu tôi chỉ chạy node index.jstừ git bash thay vì npm run startvà bị giết bằng ctrl + c, tôi không bao giờ gặp lỗi này.

Tôi không chắc tại sao, nhưng tôi đoán điều này có thể giúp được ai đó.


1
Tôi đang nhận được cùng một vấn đề với thiết lập tương tự. trong trường hợp của tôi, tôi nhận thấy rằng việc chạy một ứng dụng express qua npm sẽ sinh ra hai tiến trình, nhưng chỉ một tiến trình được đóng lại khi sử dụng ctrl + c. khi khởi động ứng dụng chỉ bằng nút, chỉ có một quá trình được mở và nó đóng đúng.
worc

1
này git cho các cửa sổ vấn đề là loại làm sáng tỏ toàn bộ điều. có vẻ như có thể có một lỗi ở đâu đó giữa mintty và một người phụ thuộc cygwin.
worc

3

Giải pháp giao diện người dùng cho người dùng Windows: Tôi thấy rằng các câu trả lời hàng đầu không phù hợp với tôi, chúng dường như là các lệnh cho người dùng Mac hoặc Linux. Tôi đã tìm thấy một giải pháp đơn giản không yêu cầu bất kỳ lệnh nào cần nhớ: mở Trình quản lý tác vụ (ctrl + shift + esc). Nhìn vào các quá trình nền đang chạy. Tìm bất cứ thứ gì Node.js và kết thúc nhiệm vụ.

Sau khi tôi làm điều này, vấn đề đã biến mất cho tôi. Như đã nói trong các câu trả lời khác, các quy trình nền vẫn đang chạy vì đã gặp lỗi trước đó và các chức năng thoát / dọn dẹp thông thường không được gọi, vì vậy một cách để giết chúng là tìm quy trình trong Trình quản lý tác vụ và giết nó ở đó . Nếu bạn đã chạy tiến trình từ terminal / powerShell, bạn thường có thể sử dụng ctrl + c để giết nó.


Vâng, đúng cảm ơn bạn đã trả lời
DINA TAKLIT

3

Viết lại nhận xét của @Gerard trong câu trả lời của tôi:

Hãy thử pkill nodejshoặc pkill nodenếu trên hệ điều hành giống như UNIX .

Điều này sẽ giết quá trình chạy máy chủ nút chạy trên bất kỳ cổng nào. Đã làm cho tôi.

Nam vị🙏


2

Nút đang chạy ở đâu đó trong bộ nhớ và khóa cổng đó. Trên Windows, vấn đề này sẽ xảy ra, giống như hầu hết các sự cố của Windows, được giải quyết bằng cách nhấn CTRL+ ALT+ DELvà / hoặc khởi động lại.


Câu hỏi này trả lời rất nhiều câu hỏi khác. Tắt nó đi, và bật lại. Thiên tài.
datUser

1

Lý do cho vấn đề này là:

  1. Bất kỳ một ứng dụng nào cũng có thể chạy trên cổng này như Skype.
  2. Nút có thể đã bị hỏng và cổng có thể không được giải phóng.
  3. Bạn có thể đã cố gắng khởi động máy chủ nhiều hơn một. Để giải quyết vấn đề này, người ta có thể duy trì một boolean để kiểm tra xem máy chủ đã được khởi động hay chưa. Nó chỉ nên được bắt đầu nếu boolean trả về false hoặc không xác định;

1

server.close () mất một lúc để đóng kết nối, do đó chúng ta nên thực hiện cuộc gọi không đồng bộ này như sau:

await server.close();

QUAN TRỌNG: khi sử dụng await , chúng ta phải sử dụng từ khóa async trong chức năng đóng gói của mình như sau:

async () => {
  await server.close();
}

1

Sử dụng lệnh dưới đây trong terminal / cmd để thay đổi cổng (npm run dev dành cho node.js), bạn có thể có các lệnh khác để chạy ứng dụng của bạn, hầu hết chúng sẽ hoạt động trong khi thay đổi cổng, dễ dàng và nhanh hơn. Hơn nữa, bạn có thể sử dụng bất kỳ số cổng nào miễn phí trong hệ thống của mình thay vì 3002

PORT=3002 npm run dev

Hầu hết khi một người chạy dự án trong khi thoát một cách đột ngột hoặc vô tình nhấn control + z cho phép bạn thoát ra khỏi cổng luôn luôn kiểm soát + c sẽ không thoát khỏi cổng để chạy máy chủ hoặc dự án.

Hơn nữa, đã đến lúc thay đổi số cổng trong mã của bạn

server.listen(3002);

0

Điều này có nghĩa là bạn có hai máy chủ nút chạy trên cùng một cổng, nếu một máy chủ đang chạy trên cổng, giả sử 3000 thay đổi một máy chủ khác sang một cổng khác, hãy nói 3001 và mọi thứ sẽ hoạt động tốt

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.