Остановите программу node.js из командной строки


305

У меня есть простой TCP-сервер, который прослушивает порт.

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

Я начинаю это с node server.jsи затем закрываю это с Ctrl + Z на Mac. Когда я пытаюсь запустить его снова с, node server.jsя получаю это сообщение об ошибке:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)

Я неправильно закрываю программу? Как я могу предотвратить это?


2
Вероятно, стоит добавить, что Ctrl-Z приостанавливает команду в * NIX и не закрывает ее. Если вы наберете fgпосле Ctrl-Z, вы вернетесь туда, где остановились. Итак, ваш предыдущий узел все еще работает. Остерегайтесь, если вы делаете это для других команд!
Ерф

1
@ ruffin это должен быть ответ. Если вы выполнили Ctrl+Zдействие, правильная методология может состоять в том, fgчтобы оживить процесс, а затем Ctrl+Cубить его должным образом.
Metagrapher

Ответы:


393

Чтобы завершить программу, вы должны использовать Ctrl+ C. Если вы сделаете это, он отправит сообщение SIGINT, что позволит программе корректно завершить работу, отменяя привязку со всех портов, которые она прослушивает.

Смотрите также: https://superuser.com/a/262948/48624


21
Ctrl + Cне работает для меня. Только ^Cнабирается в консоли, и программа не выходит.
Eleeist

1
@ Eleeist, что вы используете в качестве терминала? Это прекрасно работает для меня.
Брэд

2
@ Eleeist, вы, вероятно, переназначили свои ключи или что-то в этом роде. Ctrl+Cработает отлично. В любом случае, это отдельная проблема от вашей реальной проблемы. Вы должны опубликовать вопрос «Ctrl + C не работает» на SuperUser.com.
Брэд

1
@ jt0dd Ты всегда мог kill -9, но я бы не стал. Вы действительно уверены, что ваше приложение все еще остается открытым? У меня никогда не было этой проблемы. Как только мое приложение заканчивается, соединения всегда немедленно прекращаются. Я бы использовал netstat, чтобы определить, задерживается ли ваше приложение или что-то еще на этом порту.
Брэд

1
Я столкнулся с этой проблемой, когда использовал другой тип клавиатуры на другом языке. Убедитесь, что ваш Mac
введен на

326

Ctrl+ Zприостанавливает его, что означает, что он все еще может быть запущен.

Ctrl+ на Cсамом деле убьет его.

Вы также можете убить его вручную следующим образом:

ps aux | grep node

Найдите идентификатор процесса (второй слева):

kill -9 PROCESS_ID

Это также может работать

killall node

Ctrl + C будет работать, но ни одна из этих команд не будет работать для меня. Я не знаю почему? И я ищу решение командной строки
сердитый киви

7
Будьте осторожны с узлом killall, вы можете убить процесс, который не хотите убивать, если они соответствуют «узлу»
Сэмюэль Болдук

1
возможно, вы захотите переместиться вверх killall nodeв своем ответе, так как это действительно самый простой и надежный вариант (если вы в порядке с убийством всех случаев)
Boern

4
killall не распознается как внутренняя или внешняя команда, работающая программа или командный файл. Я что-то упускаю?
Ayyash

То же самое здесь ... Нет ответа? Там написано, что killall не распознан. Ни одна из других команд не работает. Нужно ли перезагрузить компьютер или как?
Methodician

37

Или же вы можете сделать все это в одной строке:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

Вы можете заменить узел внутри '\ snode \ s' любым другим именем процесса.


2
поочередно, вы всегда можете попробовать: ps -ef | grep "узел" | awk '{print $ 2}' | xargs kill -9
Фраймастер

Кажется, работает, но не возвращает меня к приглашению. Мысли?
Адвокат дьявола

25

Возобновить и убить процесс:

Ctrl+ Zприостанавливает его, что означает, что он все еще работает как приостановленный фоновый процесс.

Вы, вероятно, сейчас в терминале подсказки ...

  1. Дайте команду fgвозобновить процесс на переднем плане.

  2. нажмите Ctrl+, Cчтобы правильно убить его.


Кроме того, вы можете убить его вручную следующим образом:

( ПРИМЕЧАНИЕ: следующие команды могут требовать root, sudo ...как и ваш друг)

pkill -9 node

или, если у вас нет pkill, это может сработать:

killall node

или возможно это:

kill $(ps -e | grep node | awk '{print $1}')

иногда процесс перечисляет свой собственный grep, в этом случае вам понадобится:

kill $(ps -e | grep dmn | awk '{print $2}')

,


h / t @ruffin из комментариев к самому вопросу. У меня была такая же проблема, и его комментарий помог мне решить ее самостоятельно.


22

Вы можете напечатать, .exit чтобы выйти из узла JS REPL


2
Это предполагает, что вы находитесь в REPL для начала. Что если у меня запущен скрипт Node?
Игорь Ганапольский

18

Если вы используете Node.js в интерактивном режиме (REPL):

Ctrl+ Cвернет вас к> приглашению и наберет:

process.exit()

или просто используйте Ctrl+ D.


17

$ sudo killall nodeв другом терминале работает на mac , пока killall nodeне работает:

$ killall node
No matching processes belonging to you were found

13

на Linux попробуйте: pkill node

на окнах:

Taskkill /IM node.exe /F

или

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])

5

Хотя это поздний ответ, я нашел его в документации по NodeJS :

Событие 'exit' генерируется при выходе из REPL либо путем получения .exitкоманды в качестве ввода, когда пользователь <ctrl>-Cдважды нажимает на сигнал SIGINT, либо путем нажатия <ctrl>-Dна сигнал 'end' во входном потоке. Обратный вызов слушателя вызывается без каких-либо аргументов.

Таким образом, чтобы подвести итог вы можете выйти по:

  1. Typing .exit в nodejs РЕПЛ.
  2. прессование <ctrl>-C дважды.
  3. нажав <ctrl>-D.
  4. process.exit(0)что означает естественный выход из REPL. Если вы хотите вернуть любой другой статус, вы можете вернуть ненулевое число.
  5. process.kill(process.pid) это способ убить, используя nodejs api из вашего кода или из REPL.

5

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

Чистый способ управления процессами Node Server - использование foreverпакета (из NPM).

Пример:

Установите навсегда

npm install forever -g

Запустить Node Server

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Результат:

info: Forever processing file: server.js

Узел выключения сервера

forever stop server.js

результат

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

Это приведет к чистому завершению работы вашего серверного приложения.


3

Если вы хотите остановить свой сервер npm stopили что-то вроде этого. Вы можете написать код, который убивает ваш серверный процесс:

require('child_process').exec(`kill -9 ${pid}`)

Проверьте эту ссылку для деталей: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5


2

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

Примечание. Этот пример находится в оболочке bash на Mac.

Для этого я должен сделать свой nodeзвонок как можно более конкретным. Например, вместо того, чтобы звонить node server.jsиз каталога приложений, я звонюnode app_name_1/app/server.js

Тогда я могу убить его, используя:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

Это убьет только процесс узла, выполняющий app_name_1 / app / server.js.

Если ты побежал node app_name_2/app/server.js этот узел, процесс продолжит работу.

Если вы решите, что хотите убить их, вы можете использовать их, killall nodeкак уже упоминали другие.


2

Поздний ответ, но в Windows, открытие диспетчера задач с помощью CTRL + ALT + DEL, а затем уничтожение процессов Node.js решит эту ошибку.


2

Вы можете использовать следующую команду, чтобы быть конкретным в уничтожении локального сервера (здесь: 8000)

http: // localhost: 8000 / kill PID (processId):

$:lsof -i tcp:8000

Это даст вам следующие группы TCP:

КОМАНДА PID ПОЛЬЗОВАТЕЛЬ FD ТИП РАЗМЕР УСТРОЙСТВА / ВЫКЛЮЧЕНО NODE NAME

узел 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (СЛУШАТЬ)

$:kill -9 21521

Это убьет processId, соответствующий TCP *: 8000



2

Вы можете использовать фьюзер, чтобы получить то, что вы хотите сделать.

Для получения идентификаторов процессов задач, выполняемых на порту, вы можете сделать:

fuser <<target_port>>/tcp

Допустим, порт 8888, команда становится:

fuser 8888/tcp

А чтобы убить процесс, работающий в порту, просто добавьте ключ -k.

fuser <<target_port>>/tcp -k

Пример (порт 8888):

fuser 8888/tcp -k

Это оно! Это закроет процесс прослушивания порта. Я обычно делаю это перед запуском моего серверного приложения.


1

Мой пример использования: на MacOS запускать / перезапускать серверы нескольких узлов на разных портах из скрипта

запустить :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

стоп1 :"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

стоп2, стоп3 ...

перезапустить :"stop1 & stop2 & ... & stopN ; run

для получения дополнительной информации о поиске процесса по порту: кто прослушивает данный порт TCP в Mac OS X?


0

Для Windows сначала найдите PID с вашим номером порта

netstat -ano | findStr "portNumber"

После этого убейте задачу, убедитесь, что вы находитесь в корне вашего диска "c", введите описание изображения здесь и команда будетtaskkill /F /PID your pid


0

если вы используете VS Code и терминал, сначала выберите ниспадающий узел справа, а затем нажмите Ctrl + C. Затем он будет работать

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

Нажмите y, когда вам будет предложено.

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

Спасибо

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