Зупиніть програму node.js з командного рядка


304

У мене простий сервер 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, ви повернетесь там, де зупинилися. Отже ваш попередній вузол все ще працює. Слідкуйте, якщо ви робите це і для інших команд!
ruffin

1
@ruffin це має бути відповіддю. Якщо ви зробили Ctrl+Zдію, правильною методологією могло б бути fgпожвавлення процесу, а потім Ctrl+Cйого вбивство.
Метаграф

Відповіді:


393

Щоб закінчити програму, ви повинні використовувати Ctrl+ C. Якщо ви це зробите, він надсилає SIGINT, що дозволяє програмі закінчуватися граціозно, від’єднуючись від будь-яких портів, які вона слухає.

Дивіться також: https://superuser.com/a/262948/48624


21
Ctrl + Cне працює для мене. Лише ^Cнабирається в консоль, а програма не виходить.
Елеїст

1
@Eleeist, що ти використовуєш як термінал? Це чудово працює для мене.
Бред

2
@Eleeist, ти, мабуть, перезавантажив ключі чи щось таке. Ctrl+Cпрацює чудово. У будь-якому випадку, це окрема проблема від вашої реальної проблеми. Ви повинні залишити питання "Ctrl + C не працює" на SuperUser.com.
Бред

1
@ jt0dd Ви завжди могли kill -9, але я цього не зробив. Ви справді впевнені, що ваша програма все ще підтримує порти відкритими? Я ніколи не мав такої проблеми. Як тільки моя програма закінчується, з'єднання завжди негайно припиняються. Я б використовував netstat, щоб визначити, чи ваша програма чи щось інше затримується на цьому порту.
Бред

1
Я зіткнувся з цією проблемою, коли використовував тип клавіатури на іншій мові. Будьте впевнені, що ваша мова для введення тексту mac - англійська
Fa.Shapouri

325

Ctrl+ Zпризупиняє його, а значить, він все ще може працювати.

Ctrl+ Cнасправді це вб'є.

ви також можете вбити його вручну так:

ps aux | grep node

Знайдіть ідентифікатор процесу (другий зліва):

kill -9 PROCESS_ID

Це також може спрацювати

killall node

ctrl + c буде працювати, але жодна з цих команд не буде працювати для мене. Я не знаю, чому? І я шукаю рішення командного рядка
сердитий ківі

7
Будьте обережні з вузлом killall, ви можете вбити процес, якого не хочете вбивати, якщо вони відповідають "вузлу"
Самуель Болдук

1
ви можете скористатися killall nodeсвоєю відповіддю, оскільки це дійсно найпростіший і надійний варіант (якщо ви все гаразд із вбивством усіх випадків)
Boern

4
'killall' не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл. Я щось пропускаю?
Айяш

Тут же ... Немає відповіді? У ній написано, що "killall" не розпізнається. Жодна з інших команд також не працює. Чи потрібно перезавантажувати комп’ютер чи що?
Методик

37

Або ж ви можете зробити все це в один рядок:

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

Ви можете замінити вузол всередині "\ snode \ s" будь-яким іншим іменем процесу.


2
по черзі, ви завжди можете спробувати: ps -ef | grep "вузол" | awk '{print $ 2}' | xargs kill -9
frymaster

Здається, працює, але неправильно повертає мене до запиту. Думки?
Адвокат диявола

25

Відновіть і вбийте процес:

Ctrl+ Zпризупиняє його, а значить, він все ще працює як призупинений фоновий процес.

Ви, ймовірно, зараз підкажете термінал ...

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

  2. введіть Ctrl+, Cщоб правильно вбити його.


Як альтернативи, ви можете вбити його вручну , як це:

( ПРИМІТКА. Наступні команди можуть вимагати root, sudo ...як і ваш друг)

pkill -9 node

або, якщо у вас немає pkill, це може працювати:

killall node

а може це:

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

Іноді процес відображатиме список власних греп, і тоді вам знадобиться:

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

.


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



18

Якщо ви використовуєте Node.js інтерактивно (ЗВІТ):

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 :

Подія 'вихід' випромінюється, коли REPL закінчується, отримуючи .exitкоманду як вхід, користувач <ctrl>-Cдвічі натискає сигнал SIGINT, або натискаючи, <ctrl>-Dщоб сигналізувати 'кінець' у вхідному потоці. Зворотний виклик слухача викликається без жодних аргументів.

Отже, підсумовуючи, ви можете вийти:

  1. Введення .exitу вузлах REPL.
  2. Натискання <ctrl>-Cдвічі.
  3. пресування <ctrl>-D.
  4. process.exit(0)означає природний вихід з REPL. Якщо ви хочете повернути будь-який інший статус, ви можете повернути нульове число.
  5. process.kill(process.pid) це спосіб вбити за допомогою nodejs api з вашого коду чи з REPL.

5

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

Чистим способом управління процесами вашого сервера Node є використання foreverпакету (від NPM).

Приклад:

Встановити назавжди

npm install forever -g

Запустіть сервер вузлів

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

Це дозволить чітко вимкнути вашу серверну програму.


2

Якщо ви хочете зупинити ваш сервер 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

Ви можете працювати наступною командою, щоб бути конкретною в локальному сервері kill (тут: 8000)

http: // localhost: 8000 / вбити PID (processId):

$:lsof -i tcp:8000

Це дасть вам наступні групи TCP:

ВИМОГА ПІДПРИЄМНИКА ПІДПРИЄМЦЯ FD ТИП ПРИЛАДУ ВИМКНЕННЯ / ВИМК

вузол 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (LISTEN)

$: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 & ..."

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

stop2, stop3 ...

повтор :"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.