Node/Экспресс: EADDRINUSE, адрес уже используется - Kill server
У меня есть простой сервер, работающий в node.js, используя connect:
var server = require('connect').createServer();
//actions...
server.listen(3000);
В моем коде у меня есть фактические обработчики, но это основная идея. Проблема, которую я получаю, -
EADDRINUSE, Address already in use
Я получаю эту ошибку при повторном запуске приложения после того, как он был ранее разбит или ошибки. Поскольку я не открываю новый экземпляр терминала, я закрываю процесс с помощью ctr + z
.
Я уверен, что все, что мне нужно сделать, это закрыть сервер или соединение. Я пробовал звонить server.close()
в process.on('exit', ...);
без везения.
Ответы
Ответ 1
process.on('exit', ..)
не вызывается, если процесс вылетает или уничтожается. Он вызывается только тогда, когда цикл события заканчивается, и поскольку server.close()
завершает цикл события (он все еще должен ждать текущих стеков здесь и там), нет смысла помещать это внутри события exit...
В случае сбоя, сделайте process.on('uncaughtException', ..)
и на kill do process.on('SIGTERM', ..)
При этом SIGTERM (сигнал об отключении по умолчанию) позволяет очищать приложение, а SIGKILL (немедленное завершение) не позволит приложению ничего делать.
Ответ 2
Вы также можете перейти по маршруту командной строки:
ps aux | grep node
чтобы получить идентификаторы процесса.
Тогда:
kill -9 PID
Выполнение -9 на kill отправляет SIGKILL (вместо SIGTERM).
SIGTERM для меня иногда игнорировался node.
Ответ 3
Я нашел для меня самый быстрый способ разрешить это:
killall node
Ответ 4
Я ударил это на своем ноутбуке, работающем с win8. это сработало.
Запустите cmd.exe как "Администратор":
C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.
Ответ 5
Сначала вы хотели бы знать, какой процесс использует port 3000
sudo lsof -i :3000
в этом списке будет отображаться все PID, прослушивающие этот порт, как только у вас есть PID, вы можете его завершить следующим образом:
kill -9 {PID}
Ответ 6
Проверьте идентификатор 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
Ответ 7
Я нашел это решение, попробуйте дать разрешение на использование sudo
sudo pkill node
Ответ 8
Linux
Запустите ps
и определите PID вашего процесса узла.
Затем запустите sudo kill PID
Windows
Используйте список задач для отображения списка запущенных процессов:
tasklist /O
Затем завершите процесс узла следующим образом (используя PID, полученный из команды tasklist
):
taskkill /pid PID
Ответ 9
Я получал эту ошибку один раз и использовал многие из этих подходов.
Мои проблемы состояли в том, что у меня было два вызова app.listen(3000);
в том же app.js script. Первый app.listen() преуспел там, где второй сбросил ошибку.
Еще одна полезная команда, с которой я столкнулся, помогла мне отладить sudo fuser -k 3000/tcp
, которая убьет любые запущенные процессы, которые вы могли бы запустить (некоторые процессы могут перезагружаться, например, если они запускаются с forever.js, но это было полезно для меня).
Ответ 10
Вот один вкладыш (замените 3000 на порт или переменную конфигурации):
kill $(lsof -t -i:3000)
Ответ 11
Для окон откройте диспетчер задач и найдите процессы node.exe. Убейте их всех с помощью End Task.
![enter image description here]()
Ответ 12
FYI, вы можете убить процесс в одной команде sudo fuser -k 3000/tcp
. Это можно сделать для всех других портов, таких как 8000, 8080 или 9000, которые обычно используются для разработки.
Ответ 13
Пользователи PowerShell:
Taskkill/IM node.exe/F
Ответ 14
если вы используете Mac или Linux, вы можете попробовать эту команду на терминале
killall node
Ответ 15
Сначала узнайте, что работает, используя:
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
Ответ 16
Диспетчер задач (ctrl + alt + del) →
Вкладка "Процессы" →
выберите "node.exe" и нажмите "Завершить процесс"
Ответ 17
Для Visual Studio Noobs, как я
Возможно, вы запускаете процесс в других терминалах!
После закрытия терминала в Visual Studio терминал просто исчезает.
Я вручную создал новый, думая, что предыдущий был уничтожен. В действительности, каждый раз, когда я нажимал на Новый терминал, я фактически создавал новый поверх предыдущих.
Итак, я нашел первый терминал и... Вуаля, я работал там на сервере.
![multiple terminals withot realizying it]()
Ответ 18
Вы можете использовать hot- node, чтобы предотвратить ошибки сервера/ошибки времени выполнения. Горячая node автоматически перезапускает приложение nodejs для вас всякий раз, когда происходит изменение в программе node [источник]/процесс [запуск node program].
Установите hot- node с помощью npm, используя глобальную опцию:
npm install -g hotnode
Ответ 19
ps aux | grep node
kill -9 [PID] (provided by above command)
Описание:
- ps предоставит статус процесса, aux предоставит список: все процессы пользователя, u: процессы пользователя, x: все остальные процессы, не подключенные к терминалу.
- символ pipes: | передаст результат ps aux для дальнейшей манипуляции.
- grep будет искать предоставленную строку (в нашем случае это узел) из списка, предоставленного ps aux.
Ответ 20
При должном уважении ко всем ответам в форме я хотел бы добавить точку.
Я обнаружил, что когда я заканчиваю приложение node при ошибке с помощью Ctrl + Z, то в следующий раз, когда я пытаюсь открыть его, вы получаете ту же ошибку EADDRINUSE.
Когда я использую Ctrl + C для завершения приложения node, в следующий раз, когда я его открыл, он сделал это без сучка и задоринки.
Изменение номера порта на что-то другое, кроме ошибки, вызвало проблему.
Ответ 21
На всякий случай проверьте, добавили ли вы эту строку несколько по ошибке
app.listen(3000, function() {
console.log('listening on 3000')
});
Вышеприведенный код предназначен для экспресс-проверки, но просто проверьте, пытаетесь ли вы дважды использовать один и тот же порт в своем коде.
Ответ 22
В Linux.
Добавить функцию в ~/.bashrc
:
function killTcpListen () {
kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}
Измените изменения: source ~/.bashrc
И используйте его: killTcpListen 3000
Ответ 23
Win10, git bash v2.15, node v8.9.1, npm v5.5.1
У меня был пакет package.json script, чтобы запустить node: "start": "node index.js"
Всякий раз, когда я использовал это, независимо от того, убил ли я его с помощью ctrl + c, я столкнулся с этой проблемой.
Если я просто запустил node index.js
из git bash вместо npm run start
и убил ctrl + c, я никогда не получал эту ошибку.
Я не уверен, почему, но я решил, что это может помочь кому-то.
Ответ 24
Node работает где-то в памяти и заблокирован этот порт. В Windows эта проблема, как и большинство проблем Windows, будет решена путем нажатия CTRL + ALT + DEL и/или перезагрузки.
Ответ 25
Причины этих проблем:
- На этом порту, как Skype, может работать любое одно приложение.
- Node может быть разбит, и порт, возможно, не был освобожден.
- Возможно, вы попытались запустить сервер более одного. Чтобы решить эту проблему, можно поддерживать логическое значение, чтобы проверить, запущен ли сервер или нет. Его следует запускать только в том случае, если boolean возвращает false или undefined;
Ответ 26
Возможно, вы используете несколько серверов. Вы можете закрыть их и использовать один сервер. В Linux вы можете использовать команду killall node.
Ответ 27
server.close() занимает некоторое время, чтобы закрыть соединение, поэтому мы должны сделать это асинхронным вызовом как таковым:
await server.close();
ВАЖНО: при использовании await мы должны использовать ключевое слово async в нашей функции инкапсуляции как таковой:
async () => {
await server.close();
}
Ответ 28
Вы можете столкнуться со сценариями, в которых даже уничтожение потока или процесса не приведет к прекращению работы приложения (это иногда случается со мной в 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.
Ответ 29
Будьте осторожны, что, как и я, у вас нет другого окна DOS (или подобного), которое вы забыли о x)
Он произвел точную ошибку, показанную выше!
Ответ 30
Это означает, что у вас есть два сервера node, работающих на одном и том же порту, если один из них работает на порту, скажем, 3000, изменив другой на другой порт, скажем 3001, и все будет хорошо работать