Остановить 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 приостанавливает его, что означает, что он все еще работает как приостановленный фоновый процесс.
Скорее всего, вы сейчас в командной строке...
Альтернативно вы можете убить его вручную следующим образом:
( ПРИМЕЧАНИЕ: для следующих команд может потребоваться 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"
И команда будет 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
- Открытый терминал
Запустите приведенный ниже код и нажмите Enter
sudo kill $(sudo lsof -t -i:4200)