Вузол / експрес: EADDRINUSE, адреса, яка вже використовується - сервер убити


442

У мене простий сервер, що працює в node.js за допомогою connect:

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

У своєму коді у мене є фактичні обробники, але це основна ідея. Проблема, яку я продовжую отримувати, - це

EADDRINUSE, Address already in use

Я отримую цю помилку під час повторного запуску програми після того, як вона раніше вийшла з ладу або помилок. Оскільки я не відкриваю новий примірник терміналу, я закриваю цей процес ctr + z.

Я досить впевнений, що все, що мені потрібно зробити, це закрити сервер або з'єднання. Я намагався додзвонитися server.close()в process.on('exit', ...);не пощастило.


39
Насправді замість Ctrl + zвас слід використовувати, Ctrl + cщо правильно закриє програму, надіславши SIGQUIT :) Детальнішу інформацію див. У Вікі :)
nacho4d

1
Ви маєте на увазі SIGINT. SIGQUIT обумовлений `ctrl + \`
Xedecimal

53
Спробуйте pkill nodejsабо pkill nodeякщо ви хочете на UNIX-подібній ОС
Джерард

1
У мене виникла подібна проблема, і я знайшов цей пакет, який дозволить вам чисто вийти, коли ви CTRL + C: npmjs.com/package/exit-hook
Jazzy

1
1. Здається, що до порту прив’язаний висячий або мертвий ідентифікатор процесу, тому сервіс на базі вузла не запускається і не закидає помилку ПОРТ У ВИКОРИСТАННІ (ПОМИЛКА АДРЕСУ В ВИКОРИСТАННІ) 2. Ми намагаємось дізнатись, як випустити випуск порт 10000 без перезавантаження сервера.
абксарма

Відповіді:


147

process.on('exit', ..)не викликається, якщо процес виходить з ладу або вбито. Він викликається лише тоді, коли цикл подій закінчується, і оскільки server.close() сортування закінчується циклом подій (він все ще повинен чекати поточних запущених стеків тут і там), немає сенсу ставити це всередині події виходу ...

На аварії, робити process.on('uncaughtException', ..)і вбивати робитиprocess.on('SIGTERM', ..)

Зважаючи на це, SIGTERM (сигнал вбивства за замовчуванням) дозволяє програмі очищатися, тоді як SIGKILL (негайне припинення) не дозволить додатку нічого робити.


3
також корисний гачок на process.on ('SIGINT', ...)
farincz

487

Ви також можете пройти маршрут командного рядка:

ps aux | grep node

щоб отримати ідентифікатори процесу.

Тоді:

kill -9 PID

Виконуючи -9 при знищенні, він надсилає SIGKILL (замість SIGTERM). SIGTERM іноді для мене ігнорується вузлом.


1
ps aux | grep nodeнічого не показує; все ще textareaserver --editor-cmd='gvim -f'не вдається: 14 березня 21:19:30 - socket.io готовий - прийняття з'єднань. Зараз можна запустити сервер: EADDRINUSE, Адреса, яка вже використовується
Жан Йордан

75
Чому це, а неkillall -9 node
Мартін Йозефссон

1
pidofтакож зручно
JVE999

25
Я давно використовував цю відповідь, потім одного дня її зручно скласти в один вкладиш. Ця команда знищить будь-який процес, що працює на даному порту (8000 у цьому прикладі): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
У мене одразу працювало декілька серверів вузлів, деякі з них програми Electron. Мені довелося використовувати лише killпевний ідентифікатор процесу замість killall.
туліомір

227

По-перше, ви хочете знати, який процес використовується port 3000

sudo lsof -i :3000

це список усіх PID- прослуховувань на цьому порту, як тільки ви отримаєте PID, ви можете припинити його за допомогою наступного:

kill -9 {PID}

17
Ця команда чітко визначає PID на відміну від вихідного ps aux | grep nodeдля мене. Мені теж не потрібно булоsudo
Філ Гіббінс

Це найкраща відповідь. Для мене добре працював порт 8081, використовуючи React Native з пряжею.
Фернандо Барбоса

Це спрацювало для мене чудово. Я міг визначити, де використовується порт 3000, і так його закрити. Мені теж не потрібно було sudo.
Кампало

Дуже добре. Я також спробував після отримання команди, killall -9 {COMMAND}наприкладkillall -9 node
ВУЛИЧНИЙ ГРОШІВ

вау, це працювало на мене
Anoop PS

162

Я натиснув це на своєму ноутбуці під управлінням win8. це спрацювало.

Запустіть cmd.exe як "Адміністратор":

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

Я запускав його з командного вікна і випадково закривав його. Вузол продовжував працювати в задньому місці ... (навіть після припинення сеансу). У моєму випадку, коли я закрив вкладку браузера, яка була підключена до неї через веб-сокети, вона остаточно припинилась.
Бертус Крюгер

6
taskkill /F /IM node.exeпрацює як шарм для Windows у будь-якому каталозі :-) Дякую за частку !!
Марті Макгі

2
Це єдине однолінійне робоче рішення, яке мені вдалося перевірити на Windows
Whisperer Code

4
Працює під Windows 10. Мені не довелося запускати cmd.exe як адміністратор btw.
Гленн Вернер

74

Перевірте PID, тобто ідентифікатор процесу, що працює на порту 3000, командою нижче:

lsof -i tcp:3000

Він виводить щось на зразок наступного:

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

Тепер убийте процес, використовуючи:

kill -9 5805

це працювало для мене при використанні плагін sls offline.
Джунайд Атік

Дякую за це! Я щойно почав вчитися реагувати, як години тому. :) Після зупинки сервера я повторно запустив його, лише зіткнувшись з такими помилками.
Гленн

Я не отримую вихід, якщо використовую програні. Чи означає це, що в цій частині немає жодного процесу?
x89


29

Linux

Запустіть psі визначте PID процесу вашого вузла.

Потім бігайте sudo kill PID

Windows

Використовуйте список завдань для відображення списку запущених процесів:

tasklist /O

Потім вбити процес вузла так (використовуючи PID, отриманий з tasklistкоманди):

taskkill /pid PID

1
А якщо в Windows?
Тревор

1
Як зауваження ... мені чомусь довелося використовувати подвійні риски на своїх прапорах для команди taskkill від git-bash: taskkill //IM node.exe і я просто вбив вузол. працювали.
nawlbergs

23

Ось один вкладиш (замініть 3000 портом або конфігураційною змінною):

kill $(lsof -t -i:3000)

20

Я отримував цю помилку один раз і застосував тут багато підходів.

Мої проблеми app.listen(3000);полягали в тому, що у мене було два дзвінки в одному сценарії app.js. Перший app.listen () вдався там, де другий видав помилку.

Ще одна корисна команда, яку я натрапив на допомогу мені, налагоджувала те, sudo fuser -k 3000/tcpщо знищить будь-які негідні процеси, які ви могли б почати (деякі процеси можуть перезапуститись, наприклад, якщо працювати з forever.js, але це було корисно для мене).


ту ж проблему тут ... дивно, що вона працювала належним чином при налагодженні, отримуючи цю помилку для запускуnpm start
Asqan

16

Для Windows відкрийте диспетчер завдань і знайдіть процеси node.exe. Вбийте їх усі за допомогою кінця завдання.

введіть тут опис зображення


1
такий простий і не складний для користувачів Windows
momal

Це працює. Спасибі
Najathi

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

Опис:


  1. ps надасть статус процесу, aux надасть список a: всі процеси користувача, u: власні процеси користувача, x: всі інші процеси, не приєднані до терміналу.
  2. символ труби: | передасть результат ps aux для подальшого маніпулювання.
  3. grep буде шукати надану рядок (вузол у нашому випадку) зі списку, наданого ps aux.

12

FYI, ви можете вбити процес однією командою sudo fuser -k 3000/tcp. Це можна зробити для всіх інших портів, таких як 8000, 8080 або 9000, які зазвичай використовуються для розробки.



11

Спочатку з’ясуйте, що працює з використанням:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Ви отримаєте щось на кшталт:

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)

Тоді ви можете вбити процес так:

sudo kill 110

Тоді ви зможете запуститись, не отримуючи помилок прослуховування EADDRINUSE ::: 3000


Я використовую nodemon, і він знову запускає послугу. Чи є їх спосіб вбити нодемон?
Smit Patel

10

Для Visual Studio Noobs, як я

Можливо, ви запускаєте процес в інших терміналах!

Після закриття терміналу у Visual Studio термінал просто зникає .

Я вручну створив нове, думаючи, що попередній був знищений. Насправді кожен раз, коли я клацав Новий термінал, я фактично створював новий поверх попередніх .

Тож я знайшов перший термінал і ... Voila, я там запускав сервер.

кілька терміналів, що реалізують це


1
О так, мій брате.
Jaydeep Shil

8

Диспетчер завдань (ctrl + alt + del) ->

Вкладка Процеси ->

виберіть процес "node.exe" і натисніть "Завершити процес"


навіщо вбивати весь процес вузла, якщо я шукаю - це вбити процес порту вузла.
Jimmy Obonyo Abor

8

Ви можете зіткнутися зі сценаріями, коли навіть вбивання потоку чи процес фактично не припиняє додаток (це трапляється зі мною в Linux та Windows раз у раз). Іноді у вас вже може бути запущений екземпляр, який ви не закрили.

Внаслідок таких обставин я вважаю за краще додати package.json:

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

Тоді я можу зателефонувати їм за допомогою:

npm run stop-win
npm run stop-Linux

Ви можете отримати фантазії та зробити ці команди BIN зі знаком аргументу, якщо хочете. Ви також можете додати ці команди як команди, що виконуються в рамках пробного застереження.


5

У вікнах користувачів: відкрита task managerі end taskв nodejs.exeфайлі, він відмінно працює.


4

Ви можете використовувати гарячий вузол, щоб запобігти збоям / помилкам вашого сервера. Гарячий вузол автоматично перезапускає програму nodejs для вас, коли відбувається зміна програми вузла [джерело] / процес [запущена програма вузла].

Встановіть гарячий вузол за допомогою npm за допомогою глобальної опції:

npm встановити -g hotnode


pm2 - кращий вибір. більш надійний, більше варіантів. і не має проблеми при запуску як root, який є назавжди.
Лукас

@Lucas Що це за корінна проблема назавжди, про яку ти говориш? На жаль, я змушений використовувати назавжди замість pm2 на продукт на роботі (через деякі ліцензії на ліцензування), і це мене дуже турбує!
GPX

4

З належною повагою до всіх відповідей у ​​формі, я хотів би додати бал.

Я виявив, що коли я закриваю додаток для вузла з помилкою за допомогою Ctrl + Z, наступного разу, коли я намагаюся його відкрити, отримала таку ж помилку EADDRINUSE.

Коли я використовую Ctrl + C для завершення роботи додатка з вузлом, наступного разу, коли я відкрив його, це обійшлося без сучка.

Зміна номера порту на щось інше, ніж те, що помилково вирішило проблему.


1
Ctrl + C є правильним. Я використовував той же номер порту, що і раніше, і він працював, як і раніше.
vipulnj

2
<key> Ctrl-Z </key> не зупиняє процес. Це ставить його на задній план, щоб ви могли запускати інші команди. Це річ оболонки Unix. Щоб продовжити процес, використовуйте fgв цій самій консолі. Потім ви зможете побачити, що відбувається на цьому сервері після введення різних команд у командному рядку.
Алексіс Вільке

4

У Linux.

Додати функцію до ~/.bashrc:

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

Потягніть зміни: source ~/.bashrc

І використовуйте: killTcpListen 3000


3

На всякий випадок перевірте, чи додавали ви цей рядок кілька разів помилково

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

Вищевказаний код призначений для експресу, але просто перевірте, чи намагаєтесь ви два рази використовувати той самий порт у своєму коді.


3

Win10, git bash v2.15, вузол v8.9.1, npm v5.5.1

У мене був сценарій package.json для запуску вузла: "start": "node index.js"

Кожного разу, коли я використовував це, незалежно від того, чи вбив його за допомогою ctrl + c, я стикався з цим питанням.

Якби я просто біг node index.jsз git bash замістьnpm run start а вбивав із ctrl + c, я ніколи не отримував цієї помилки.

Я не впевнений, чому, але я вважав, що це може комусь допомогти.


1
Я отримую те саме питання з по суті тим же налаштуванням. у моєму випадку я помітив, що запуск експрес-програми через npm породжує два процеси, але лише один закритий при використанні ctrl + c. при запуску програми лише вузлом відкривається лише один процес, і він закривається правильно.
worc

1
цей git для Windows видає своєрідне пролиття світла на все. здається, що може виникнути помилка десь між м'ятою і залежністю від цигувіна.
worc

3

Рішення користувальницького інтерфейсу Для користувачів Windows: Я виявив, що головні відповіді не працюють для мене, вони здаються командами для користувачів Mac чи Linux. Я знайшов просте рішення, яке не вимагало запам'ятовувати жодних команд: відкрийте диспетчер завдань (ctrl + shift + esc). Подивіться на запущені фонові процеси. Знайдіть що-небудь Node.js і закінчіть завдання.

Після того як я це зробив, для мене це питання пішло. Як зазначено в інших відповідях, це фонні процеси, які все ще запущені, тому що раніше виникала помилка, і регулярні функції виходу / очищення не викликали, тому один із способів їх вбити - це знайти процес у диспетчері завдань і вбити його там . Якщо ви запустили процес з терміналу / powerShell, зазвичай ви можете використовувати ctrl + c для його вбивства.


Так, правильно дякую за вашу відповідь
DINA TAKLIT

3

Переписування коментаря @Gerard у моїй відповіді:

Спробуйте pkill nodejsабо pkill nodeв ОС, схожій на UNIX .

Це знищить процес запуску сервера вузлів, який працює на будь-якому порту. Працювали для мене.

Намасте🙏


2

Вузол працює десь у пам'яті і цей порт заблокований. У Windows ця проблема буде, як і в більшості проблем Windows, вирішуватися натисканням CTRL+ ALT+ DELта / або перезавантаження.


Це питання дає відповідь на безліч інших питань. Вимкніть його і знову увімкніть. Геніальність.
datUser

1

Причини цього питання:

  1. Будь-яка одна програма може працювати на цьому порту, як Skype.
  2. Можливо, вузол розбився, а порт може не бути звільнений.
  3. Можливо, ви намагалися запустити більше ніж один сервер. Щоб вирішити цю проблему, можна підтримувати булевий сигнал, щоб перевірити, запущений чи ні сервер. Її слід запускати лише у тому випадку, якщо булева повертається помилковою чи невизначеною;

1

server.close () потребує певного часу, щоб закрити з'єднання, тому ми повинні зробити це асинхронним викликом як таким:

await server.close();

ВАЖЛИВО: при використанні ЧЕКАЄ , ми повинні використовувати асинхронне ключове слово в нашій огортає функції як такі:

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

1

Використовуйте команду нижче в терміналі / cmd, щоб змінити порт (npm run dev - це для node.js), можливо, у вас є інші команди для запуску програми, більшість з яких буде працювати, змінюючи порт, простіше та швидше. Крім того, ви можете використовувати будь-який номер порту, безкоштовний у вашій системі замість 3002

PORT=3002 npm run dev

Більшість випадків, коли хтось запускає проект під час виходу з нього різко або несвідомо натискає на контроль + z, що дає вам вихід з порту, завжди переходить до управління + c, який не вийде з порту для запуску сервера чи проекту.

Крім того, прийшов час змінити номер порту у вашому коді

server.listen(3002);

0

Це означає, що у вас є два сервери вузлів, що працюють на одному порту, якщо один працює на порту, скажімо, 3000 змінить інший на інший порт, скажімо, 3001, і все буде добре

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.