2010-11-02 3 views
231

У меня есть простой сервер, работающий в Node.js с помощью подключения:Узел/Экспресс: EADDRINUSE, адрес уже используется - Убей сервер

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

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

EADDRINUSE, Address already in use 

Эта ошибка возникает при запуске приложения после того, как оно было ранее разбито или ошибки. Поскольку я не открываю новый экземпляр терминала, я закрываю процесс с помощью ctr + z.

Я абсолютно уверен, что все, что мне нужно, это закрыть сервер или соединение. Я пробовал звонить server.close() в process.on('exit', ...); без везения.

+26

На самом деле вместо 'Ctrl + z' вы должны использовать' Ctrl + c', который правильно закроет программу, отправив SIGQUIT :) См. раздел [ wiki] (http://en.wikipedia.org/wiki/Signal_ (вычисления)) для получения дополнительной информации :) – nacho4d

+1

Вы имеете в виду SIGINT. SIGQUIT вызван 'ctrl + \\' – Xedecimal

+0

use 'server.close()' для серверов previuos. –

ответ

90

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

в аварии, делать process.on('uncaughtException', ..) и убивать сделать process.on('SIGTERM', ..)

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

+3

Это также полезный hook на process.on ('SIGINT', ...) – farincz

14

Вы работаете в linux или windows? Если на linux введите: ps и проверьте PID процесса узла.

тогда sudo kill PID

EDIT: Для Windows:

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

tasklist /O

, а затем убить процесс узла, как так (ПИД-код, полученный из команды tasklist):

taskkill /pid PID

+1

А если на Windows? – Trevor

+0

Как записка ... по какой-то причине я пришлось использовать двойные слэши на моих флагах для команды taskkill из git-bash: 'taskkill // IM node.exe' и я только что убил узел. работал. – nawlbergs

339

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

ps aux | grep node 

получить идентификаторы процессов.

Тогда:

kill -9 PID 

Проделав то -9 на убийство посылает SIGKILL (вместо SIGTERM). SIGTERM иногда игнорировался узлом.

+0

Что действительно решить это для меня делает две вещи. 1. Запуск моего сервера как демона/задания. 2. при запуске в bash, убивая процесс с помощью ctrl + c. Нечетная ошибка иногда приводит к неожиданному сбою приложения, затем я обычно «убиваю » – Skawful

+0

'ps aux | grep node' ничего не показывает; еще 'textareaserver -editor-cmd = 'gvim -f'' не работает: 14 марта 21:19:30 - сокет.io готовые к принятию соединения Теперь можно запустить сервер: EADDRINUSE, адрес уже используется –

+24

Почему это, а не 'killall -9 node' –

148

я нашел для меня самый быстрый способ решить это было:

killall node 
+0

тоже не работал. Мне нужно было убить -SIGKILL pid – Chandru

+2

Это возвращает, '' killall 'не распознается как внутренняя или внешняя команда на ПК. –

+0

@CodeWhisperer 'killall' - это команда Unix – Pier

3

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

+0

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

83

Я ударил это на своем ноутбуке, бегом win8. это сработало.

Run cmd.exe как 'Администратор':

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

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

+3

'taskkill/F/IM node.exe' работает как очарование для меня в Windows из любого каталога :-) Спасибо за долю! –

+1

Это единственное однострочное рабочее решение, которое я смог проверить для окон –

4

Вы можете использовать горячий узел, чтобы предотвратить сервер от сбоя/Run-Time-ошибки. Горячий узел автоматически перезапускает приложение nodejs для вас всякий раз, когда происходит изменение в узловой программе [source]/process [running node program].

Установите горячий узел, используя НПЙ, используя глобальную опцию:

npm install -g hotnode

+2

nodemon/forever - лучший вариант –

+1

@matejkramny вы можете прокомментировать, почему это так? – mikeybaby173

+0

pm2 - лучший выбор. более надежный, больше возможностей. и не имеет проблемы при запуске как root, который навсегда имеет. – Lucas

10

Я был когда-то получает эту ошибку и принял многие из подходов здесь.

Мои проблемы заключались в том, что у меня было два вызова app.listen(3000); в том же скрипте app.js. Первый app.listen() преуспел там, где второй сбросил ошибку.

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

+0

Очень полезная команда для выполнения. –

1

Причины этим вопросам являются:

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

Возможно использование нескольких серверов. Вы можете закрыть их и использовать один сервер. В Linux вы можете использовать команду killall node.

2

Task Manager (Ctrl + Alt + Del) ->

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

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

+0

Зачем убивать весь процесс узла, если я ищу, чтобы убить процесс порта узла. –

7

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

0

Будьте осторожны, что, как я, у вас нет другого окна DOS (или аналогичный) работает, что вы забыли о х)

Он сделал произвести точную ошибку, показанную выше!

-3

Эта команда перечисляет задачи, связанные с «узлом», и каждая из них завершается.

kill -9 $(ps -ae | grep 'node' | awk '{print $1}') 
+7

Было бы хорошо описать ваш код и почему это работает. –

+0

команда без кода, что это делает? –

+3

Это убьет любого редактора Atom, Slack Helpers и других приложений, которые используют «узел» в своем имени или параметрах. – Jordie

0

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

11

я нашел это решение, попробуйте его

pkill node 
+0

Я все еще вижу процесс узла с помощью этой команды: 'ps aux | grep node' –

+0

окончательно ваша команда разрешает ошибку :) Спасибо – Mohsin

3

С должным уважением ко всем ответам в форме, я хотел бы добавить пункт.

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

Когда я использую Ctrl + C, чтобы завершить приложение узла, в следующий раз, когда я его открыл, он сделал это без сучка и задоринки.

Изменение номера порта на что-то другое, кроме ошибочного, решило проблему.

+0

Ctrl + C является правильным. Я использовал тот же номер порта, что и раньше, и работал по-прежнему. – vipulnj

45

Во-первых, вы хотите знать, какой процесс использует port 3000

sudo lsof -i :3000 

будет выведен список всех PID прослушивает этот порт, когда у вас есть PID вы можете прервать его следующим образом:

kill -9 {PID} 
+2

Эта команда четко идентифицирует PID в отличие от вывода 'ps aux | grep node' для меня. Я также не нуждался в 'sudo' –

+0

Это сработало для меня. Большое спасибо. :) – Woppi

6

пользователей PowerShell:

Taskkill /IM node.exe /F

1

Только в случае проверки, если вы добавили эту линию Множественные раз по ошибке

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

Приведенный выше код для экспресс, но просто проверить, если вы пытаетесь использовать один и тот же порт дважды в вашем коде.

0

Интересно, почему никто еще не упомянул эту возможность:

  • Если вы предоставите ::listen(port) со строкой (намеренно или нет), который не был бы действительным представлением номера порта, он может быть внутренне преобразован в номер порта -1, ant, а затем двигатель попытается подключиться к этому порту -1, который затем даст ту же ошибку EADDRINUSE, которая, в свою очередь, может немного запутывать и повернуть вас в неправильном направлении для поиска ошибок (hi, me xD) ,

Итак, отладки кода и проверить, что именно вы передаете функции, перед началом проверки для процессов, которые используют свой порт.

2

О Linux.

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

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

Напряжения изменения: source ~/.bashrc

и использовать его: killTcpListen 3000

9

Проверьте 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 
1

Win10, мерзавец Баш v2.15, узел v8.9.1, v5.5.1 НПМ

I имел скрипт 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 issue] (https://github.com/git-for-windows/git/issues/1248) - это пролить свет на все это. похоже, может быть ошибка где-то между mintty и зависимостью cygwin. – worc

+1

это правда, у меня такая же проблема в окнах. –

0

У меня тоже такая же проблема.

  • закрыть все CMD строки или мерзавец Баш в диспетчере задач

если не работал перезагрузить систему

В другом сценарии, я должен был установить последний узел и дал НПМ установить в качестве администратора это сработало.

Смежные вопросы