Узел / Экспресс: EADDRINUSE, Адрес уже используется - Kill server


445

У меня есть простой сервер, работающий в 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
У меня была похожая проблема, и я нашел этот пакет, который позволит вам корректно завершить работу,
Jazzy

1
1. Похоже, что к порту привязан привязанный или мертвый идентификатор процесса, поэтому служба Node Based не запускается и выдает ошибку PORT IN USE (ERROR ADDRESS IN USE) 2. Мы пытаемся выяснить, как освободить порт 10000 без перезагрузки сервера.
abksharma

Ответы:


147

process.on('exit', ..)не вызывается, если процесс падает или убит. Он вызывается только тогда, когда цикл событий заканчивается, и так как server.close() сортировка завершает цикл событий (ему все еще приходится ждать текущие стеки здесь и там), нет смысла помещать это в событие выхода ...

На краш, делай process.on('uncaughtException', ..)и на убийство делайprocess.on('SIGTERM', ..)

При этом SIGTERM (сигнал по умолчанию) позволяет приложению очиститься, в то время как SIGKILL (немедленное прекращение) не позволяет приложению ничего делать.


3
это также полезно для процесса.on ('SIGINT', ...)
farincz

490

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

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
Мартин Йозефссон

2
pidofтоже удобно
JVE999

25
Я использовал этот ответ в течение длительного времени, а затем однажды для удобства lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
собрал

1
У меня одновременно работало несколько узловых серверов, некоторые из которых были приложениями Electron. Мне пришлось использовать только killс конкретным идентификатором процесса вместо killall.
Тулиомир

231

Во-первых, вы хотели бы знать, какой процесс использует 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
Code Whisperer

4
Работает на Windows 10. Мне не нужно было запускать cmd.exe от имени администратора.
Гленн Вернер

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.
Junaid Atique

Спасибо за это! Я только начал учиться реагировать, как часы назад. :) После остановки сервера я перезапустил его, только чтобы встретить такие ошибки.
Гленн

Я не получаю вывод, если использую потерянный. Означает ли это, что в этой части нет процесса?
x89


29

Linux

Запустите psи определите PID вашего процесса узла.

Затем беги sudo kill PID

Windows

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

tasklist /O

Затем завершите процесс узла следующим образом (используя PID, полученный из tasklistкоманды):

taskkill /pid PID

1
А если на винде?
Тревор

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

Для окон откройте диспетчер задач и найдите процессы node.exe. Убейте их всех с помощью End Task.

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


1
так легко и не сложно для пользователей окон
momal

Оно работает. Спасибо
Наджати

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

Описание:


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

12

К вашему сведению, вы можете убить процесс одной командой 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 listen


Я использую nodemon, и он перезапускает сервис снова. Есть ли способ убить нодмонов?
Смит Патель

10

Для Visual Studio Noobs, как я

Вы можете запустить процесс в других терминалах!

После закрытия терминала в Visual Studio терминал просто исчезает .

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

Итак, я нашел первый терминал и ... Вуаля, я работал там на сервере.

несколько терминалов, которые это реализуют


1
Ах да, мой брат.
Джейдип Шил

8

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

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

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


зачем убивать весь процесс узла, если то, что я ищу, это убить процесс порта узла.
Джимми Обонио Абор

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 с флагом аргумента. Вы также можете добавить их в качестве команд для выполнения в предложении try-catch.


5

В окнах пользователей: открытая task managerи end taskв nodejs.exeфайле, он отлично работает.


4

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

Установите hot-node, используя npm, используя глобальную опцию:

npm install -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

В линуксе

Добавить функцию к ~/.bashrc:

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

Потяните изменения: source ~/.bashrc

И использовать это: killTcpListen 3000


4

Переписав комментарий @Gerard в мой ответ:

Попробуйте pkill nodejsили pkill nodeесли на UNIX-подобных ОС.

Это убьет процесс, выполняющий сервер узла, работающий на любом порту. Работал на меня.

Namaste🙏


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.jsgit bash, npm run startа не убиваю ctrl + c, я никогда не получаю эту ошибку.

Я не уверен, почему, но я подумал, что это может кому-то помочь.


1
я получаю ту же проблему, по сути, с такой же настройкой. в моем случае я заметил, что запуск экспресс-приложения через npm порождает два процесса, но только один из них закрывается при использовании ctrl + c. при запуске приложения только с узлом открывается только один процесс, и он корректно закрывается.
worc

1
Эта проблема с Git for Windows как бы проливает свет на все это. кажется, что где-то между mintty и cygwin-зависимостью может быть ошибка.
Ворк

3

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

После того, как я сделал это, проблема ушла для меня. Как указано в других ответах, это фоновые процессы, которые все еще работают, потому что ранее была обнаружена ошибка, и обычные функции выхода / очистки не были вызваны, поэтому один из способов их убить - найти процесс в диспетчере задач и уничтожить его там. , Если вы запустили процесс из терминала / PowerShell, вы обычно можете использовать Ctrl + C, чтобы убить его.


Да, правильно, спасибо за ваш ответ
ДИНА ТАКЛИТ

2

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


Этот вопрос отвечает на многие другие вопросы. Выключите его и включите снова. Genius.
datUser

1

Причины для этих проблем:

  1. На этом порту может работать любое приложение, например, Skype.
  2. Возможно, произошел сбой узла, а порт не был освобожден.
  3. Возможно, вы пытались запустить сервер более одного. Чтобы решить эту проблему, можно сохранить логическое значение, чтобы проверить, запущен ли сервер или нет. Его следует запускать только в том случае, если логическое значение возвращает false или undefined;

1

server.close () занимает некоторое время, чтобы закрыть соединение, поэтому мы должны сделать это асинхронным вызовом как таковым:

await server.close();

ВАЖНО: при использовании await мы должны использовать ключевое слово async в нашей функции инкапсуляции как таковой:

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

1

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

PORT=3002 npm run dev

В большинстве случаев, когда вы запускаете проект, внезапно или по незнанию выходя из него, нажимаете control + z, который дает вам выход из порта, всегда выбирайте control + c, который не выходит из порта для запуска сервера или проекта.

Кроме того, пришло время изменить номер порта в вашем коде

server.listen(3002);

0

Это означает, что у вас есть два сервера узлов, работающих на одном и том же порту, если один работает на порту, скажем, 3000, замените другой на другой порт, скажем, 3001, и все будет работать хорошо

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.