Zatrzymaj program node.js z wiersza polecenia

304

Mam prosty serwer TCP, który nasłuchuje na porcie.

var net = require("net");

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

server.listen(7777);

Zaczynam od, node server.jsa następnie zamykam za pomocą Ctrl + Z na Macu. Gdy próbuję uruchomić go ponownie z, node server.jspojawia się następujący komunikat o błędzie:

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)

Czy zamykam program w niewłaściwy sposób? Jak mogę temu zapobiec?

Eleeist
źródło
2
Prawdopodobnie warto dodać, że Ctrl-Z zawiesza polecenie w * NIX i go nie zamyka. Jeśli wpiszesz fgpo Ctrl-Z, wrócisz tam, gdzie przerwałeś. Twój wcześniejszy węzeł nadal działa. Uważaj, jeśli robisz to także dla innych poleceń!
ruffin
1
@ruffin powinna to być odpowiedź. Jeśli wykonałeś tę Ctrl+Zczynność, właściwą metodologią może być fgożywienie procesu, a następnie Ctrl+Cprawidłowe jego zabicie.
Metagrapher

Odpowiedzi:

393

Aby zakończyć program, powinieneś używać Ctrl+ C. Jeśli to zrobisz, wysyła SIGINT, co pozwala programowi zakończyć się z wdziękiem, odłączając od portów, na których nasłuchuje.

Zobacz także: https://superuser.com/a/262948/48624

Ćwiek
źródło
21
Ctrl + Cnie działa dla mnie ^CZostaje tylko wpisany do konsoli, a program się nie kończy.
Eleeist
1
@Eleeist, Czego używasz jako terminala? Działa świetnie dla mnie.
Brad
2
@Eleeist, Prawdopodobnie ponownie przypisałeś klucze lub coś takiego. Ctrl+Cdziała w porządku. W każdym razie jest to problem odrębny od twojego prawdziwego problemu. Powinieneś opublikować pytanie „Ctrl + C nie działa” na SuperUser.com.
Brad
1
@ jt0dd Zawsze możesz kill -9, ale nie zrobiłbym tego. Czy naprawdę jesteś pewien, że Twoja aplikacja wciąż utrzymuje otwarte porty? Nigdy nie miałem tego problemu. Gdy tylko kończy się moja aplikacja, połączenia są zawsze natychmiast przerywane. Użyłbym netstat, aby ustalić, czy twoja aplikacja lub coś innego pozostaje na tym porcie.
Brad
1
Napotkałem ten problem, gdy używałem klawiatury w innym języku. Upewnij się, że Twoim językiem wejściowym systemu Mac jest angielski
Fa.Shapouri
325

Ctrl+ Zzawiesza go, co oznacza, że ​​może nadal działać.

Ctrl+ Cfaktycznie go zabije.

możesz także zabić go ręcznie w następujący sposób:

ps aux | grep node

Znajdź identyfikator procesu (drugi od lewej):

kill -9 PROCESS_ID

To może również działać

killall node
Jamund Ferguson
źródło
ctrl + c będzie działać, ale żadne z tych poleceń nie będzie dla mnie działać. Nie wiem dlaczego I szukam rozwiązania z linii poleceń
zły kiwi
7
Uważaj na killall node, możesz zabić proces, którego nie chcesz zabić, jeśli pasują do „node”
Samuel Bolduc
1
możesz przejść wyżej killall nodew swojej odpowiedzi, ponieważ jest to naprawdę najłatwiejsza i najbardziej niezawodna opcja (pod warunkiem, że jesteś w stanie zabić wszystkie instancje)
Boern
4
„killall” nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy. Coś mi brakuje?
Ayyash,
To samo tutaj ... Brak odpowiedzi? Mówi, że „killall” nie jest rozpoznawany. Żadne z pozostałych poleceń też nie działa. Czy muszę ponownie uruchomić komputer, czy co?
metodolog
37

Możesz też zrobić to wszystko w jednym wierszu:

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

Możesz zastąpić węzeł wewnątrz „\ snode \ s” dowolną inną nazwą procesu.

Hamid Tavakoli
źródło
2
alternatywnie zawsze możesz spróbować: ps -ef | grep "node" | awk '{print 2 USD}' | xargs kill -9
frymaster
Wydaje się, że działa, ale nie przywraca mnie poprawnie do monitu. Myśli?
Adwokat diabła,
25

Wznów i zabij proces:

Ctrl+ Zzawiesza go, co oznacza, że ​​nadal działa jako zawieszony proces w tle.

Prawdopodobnie teraz pojawia się monit w terminalu ...

  1. Daj polecenie fg wznowienia procesu na pierwszym planie.

  2. wpisz Ctrl+, Caby poprawnie go zabić.


Alternatywnie, można go zabić ręcznie tak:

( UWAGA: poniższe polecenia mogą wymagać rootowania, podobnie jak sudo ...twój przyjaciel)

pkill -9 node

lub, jeśli nie masz pkill, może to działać:

killall node

a może to:

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

czasami proces wyświetli własny grep, w takim przypadku będziesz potrzebować:

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

.


h / t @ruffin z komentarzy do samego pytania. Miałem ten sam problem, a jego komentarz pomógł mi go rozwiązać samodzielnie.

Metagrapher
źródło
22

możesz wpisać, .exit aby wyjść z węzła js REPL

sunny1304
źródło
2
Zakłada się, że na początku jesteś w REPL . Co jeśli mam uruchomiony skrypt Node?
IgorGanapolsky
18

Jeśli korzystasz z Node.js interaktywnie (REPL):

Ctrl+ Cwróci do> monitu, a następnie wpisz:

process.exit()

lub po prostu użyj Ctrl+ D.

sr77in
źródło
17

$ sudo killall nodew innym terminalu działa na komputerze Mac , ale killall nodenie działa:

$ killall node
No matching processes belonging to you were found
Maksym Jefremow
źródło
13

na Linuksie spróbuj: pkill node

w systemie Windows:

Taskkill /IM node.exe /F

lub

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
Jason
źródło
5

Chociaż jest to późna odpowiedź, znalazłem to w dokumentacji NodeJS :

Zdarzenie „exit” jest emitowane po wyjściu z REPL albo przez otrzymanie .exitpolecenia jako danych wejściowych, użytkownik <ctrl>-Cdwukrotnie naciskając, aby zasygnalizować SIGINT, lub naciskając, <ctrl>-Daby zasygnalizować „koniec” w strumieniu wejściowym. Wywołanie zwrotne detektora jest wywoływane bez żadnych argumentów.

Podsumowując, możesz wyjść z:

  1. Pisanie .exitw nodejs REPL.
  2. <ctrl>-CDwukrotne naciśnięcie .
  3. naciskając <ctrl>-D.
  4. process.exit(0)co oznacza naturalne wyjście z REPL. Jeśli chcesz zwrócić jakikolwiek inny status, możesz zwrócić niezerową liczbę.
  5. process.kill(process.pid) to sposób na zabicie przy użyciu nodejs api z twojego kodu lub z REPL.
randominstanceOfLivingThing
źródło
5

Dodaję tę odpowiedź, ponieważ dla wielu projektów z wdrożeniami produkcyjnymi mamy skrypty, które zatrzymują te procesy, więc nie musimy.

Czystym sposobem zarządzania procesami serwera węzłów jest użycie foreverpakietu (z NPM).

Przykład:

Zainstaluj na zawsze

npm install forever -g

Uruchom serwer węzłów

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

Wynik:

info: Forever processing file: server.js

Zamknij serwer węzłów

forever stop server.js

Wynik

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

Spowoduje to czyste zamknięcie aplikacji serwera.

Dekodowane
źródło
2

Wystąpił problem polegający na tym, że mam wiele serwerów węzłów i chcę po prostu zabić jeden z nich i ponownie wdrożyć go ze skryptu.

Uwaga: ten przykład znajduje się w powłoce bash na Macu.

W tym celu staram się, aby moje nodepołączenie było jak najbardziej szczegółowe. Na przykład dzwonię zamiast dzwonić node server.jsz katalogu aplikacjinode app_name_1/app/server.js

Następnie mogę go zabić za pomocą:

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

Zabije to tylko proces węzła z uruchomioną nazwą_aplikacji_1 / app / server.js.

Jeśli uciekłeś node app_name_2/app/server.js ten węzeł, proces będzie kontynuowany.

Jeśli zdecydujesz, że chcesz ich zabić, możesz użyć wszystkiego, o killall nodeczym wspominali inni.

bapin93
źródło
2

Późna odpowiedź, ale w systemie Windows otwarcie menedżera zadań za pomocą CTRL + ALT + DEL, a następnie zabicie procesów Node.js rozwiąże ten błąd.

Robert Molina
źródło
2

możesz pracować następującą komendą, aby być konkretnym w zabiciu serwera lokalnego (tutaj: 8000)

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

$:lsof -i tcp:8000

Otrzymasz następujące grupy TCP:

POLECENIE PID UŻYTKOWNIK TYP FD ROZMIAR URZĄDZENIA / WYŁĄCZ NAZWA NAZWY

węzeł 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (LISTEN)

$:kill -9 21521

Zabije processID odpowiadający TCP *: 8000

Ank_247shbm
źródło
2

W systemie MacOS

  1. Otwórz terminal
  2. Uruchom poniższy kod i naciśnij Enter

     sudo kill $(sudo lsof -t -i:4200)
Siddhant Senapati
źródło
2

Możesz użyć utrwalacza aby uzyskać to, co chcesz zrobić.

Aby uzyskać identyfikatory procesów zadań uruchomionych na porcie, możesz:

fuser <<target_port>>/tcp

Powiedzmy, że port to 8888, polecenie staje się:

fuser 8888/tcp

Aby zabić proces działający na porcie, po prostu dodaj przełącznik -k.

fuser <<target_port>>/tcp -k

Przykład (port to 8888):

fuser 8888/tcp -k

Otóż ​​to! Zamknie to proces nasłuchiwania na porcie. Zwykle robię to przed uruchomieniem aplikacji serwera.

Vikram Bankar
źródło
1

Mój przypadek użycia: w systemie MacOS uruchom / uruchom ponownie wiele serwerów węzłów na różnych portach ze skryptu

uruchomić :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

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

stop2, stop3 ...

powtórnie :"stop1 & stop2 & ... & stopN ; run

Aby uzyskać więcej informacji o wyszukiwaniu procesu według portu: Kto nasłuchuje na danym porcie TCP w systemie Mac OS X?

Edan Chetrit
źródło
0

W systemie Windows najpierw wyszukaj PID z numerem portu

netstat -ano | findStr "portNumber"

Następnie zabij zadanie, upewnij się, że jesteś w katalogu głównym dysku „c”, wprowadź opis zdjęcia tutaj a polecenie będzietaskkill /F /PID your pid

gem007bd
źródło
0

jeśli używasz kodu VS i terminalu wybierz najpierw węzeł z menu rozwijanego po prawej stronie, a następnie wykonaj kombinację klawiszy Ctrl + C. Następnie zadziała

wprowadź opis zdjęcia tutaj

Po wyświetleniu monitu naciśnij y.

wprowadź opis zdjęcia tutaj

Dzięki

MindRoasterMir
źródło