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

У меня есть простой 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)

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

Ответ 1

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

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

Ответ 2

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

Ctrl + C фактически убьет его.

вы также можете убить его так:

ps aux | grep node

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

kill -9 PROCESS_ID

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

killall node

Ответ 3

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

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

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

Ответ 4

вы можете ввести .exit, чтобы выйти из node js REPL

Ответ 5

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

Ctrl + C вернет вас в > приглашение, затем введите:

process.exit()

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

Ответ 6

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

$ killall node
No matching processes belonging to you were found

Ответ 7

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

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

Скорее всего, вы сейчас в командной строке...

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

  • введите 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 из комментариев по самому вопросу. У меня была такая же проблема, и его комментарий помог мне решить ее сам.

Ответ 8

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

на окнах:

Taskkill /IM node.exe /F

или же

from subprocess import call

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

Ответ 9

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

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

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

  • Ввод .exit в nodejs REPL.
  • Дважды нажмите <ctrl>-C.
  • нажатие <ctrl>-D.
  • process.exit(0) означает естественный выход из REPL. Если вы хотите вернуть какой-либо другой статус, вы можете вернуть ненулевой номер.
  • process.kill(process.pid) - это способ убить using nodejs api из вашего кода или из REPL.

Ответ 10

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

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

Пример:

Установить Forever

npm install forever -g

Запустить Node Сервер

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

Результат:

info: Forever processing file: server.js

Выключение Node Сервер

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

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

Ответ 11

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

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

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

Ответ 12

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

Примечание. Этот пример находится в оболочке 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}')

Это приведет только к уничтожению процесса node с запуском app_name_1/app/server.js.

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

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

Ответ 13

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

Ответ 14

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

выполнить: "cd $PATH1 && node server1.js & cd $PATH2 && node server2.js &..."

stop1: "kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

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

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

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

Ответ 15

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

netstat -ano | findStr "portNumber"

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

Ответ 16

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

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

$:lsof -i tcp:8000

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

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

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

$:kill -9 21521

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

Ответ 17

Для MacOS

  1. Открытый терминал
  2. Запустите приведенный ниже код и нажмите Enter

     sudo kill $(sudo lsof -t -i:4200)