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.js
a następnie zamykam za pomocą Ctrl + Z na Macu. Gdy próbuję uruchomić go ponownie z, node server.js
pojawia 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?
fg
po 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ń!Ctrl+Z
czynność, właściwą metodologią może byćfg
ożywienie procesu, a następnieCtrl+C
prawidłowe jego zabicie.Odpowiedzi:
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
źródło
Ctrl + C
nie działa dla mnie^C
Zostaje tylko wpisany do konsoli, a program się nie kończy.Ctrl+C
dział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.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.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:
Znajdź identyfikator procesu (drugi od lewej):
To może również działać
źródło
killall node
w swojej odpowiedzi, ponieważ jest to naprawdę najłatwiejsza i najbardziej niezawodna opcja (pod warunkiem, że jesteś w stanie zabić wszystkie instancje)Możesz też zrobić to wszystko w jednym wierszu:
Możesz zastąpić węzeł wewnątrz „\ snode \ s” dowolną inną nazwą procesu.
źródło
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 ...
Daj polecenie
fg
wznowienia procesu na pierwszym planie.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)lub, jeśli nie masz pkill, może to działać:
a może to:
czasami proces wyświetli własny grep, w takim przypadku będziesz potrzebować:
.
h / t @ruffin z komentarzy do samego pytania. Miałem ten sam problem, a jego komentarz pomógł mi go rozwiązać samodzielnie.
źródło
możesz wpisać,
.exit
aby wyjść z węzła js REPLźródło
Jeśli korzystasz z Node.js interaktywnie (REPL):
Ctrl+ Cwróci do> monitu, a następnie wpisz:
lub po prostu użyj Ctrl+ D.
źródło
$ sudo killall node
w innym terminalu działa na komputerze Mac , alekillall node
nie działa:źródło
na Linuksie spróbuj:
pkill node
w systemie Windows:
lub
źródło
Chociaż jest to późna odpowiedź, znalazłem to w dokumentacji NodeJS :
Podsumowując, możesz wyjść z:
.exit
w nodejs REPL.<ctrl>-C
Dwukrotne naciśnięcie .<ctrl>-D
.process.exit(0)
co oznacza naturalne wyjście z REPL. Jeśli chcesz zwrócić jakikolwiek inny status, możesz zwrócić niezerową liczbę.process.kill(process.pid)
to sposób na zabicie przy użyciu nodejs api z twojego kodu lub z REPL.źródło
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
forever
pakietu (zNPM
).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.
źródło
Jeśli chcesz zatrzymać swój serwer
npm stop
lub coś takiego. Możesz napisać kod, który zabije proces serwera jako:Sprawdź ten link, aby poznać szczegóły: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
źródło
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
node
połączenie było jak najbardziej szczegółowe. Na przykład dzwonię zamiast dzwonićnode server.js
z 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 node
czym wspominali inni.źródło
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.
źródło
możesz pracować następującą komendą, aby być konkretnym w zabiciu serwera lokalnego (tutaj: 8000)
Otrzymasz następujące grupy TCP:
Zabije processID odpowiadający TCP *: 8000
źródło
W systemie MacOS
Uruchom poniższy kod i naciśnij Enter
źródło
Możesz użyć utrwalacza aby uzyskać to, co chcesz zrobić.
Aby uzyskać identyfikatory procesów zadań uruchomionych na porcie, możesz:
Powiedzmy, że port to 8888, polecenie staje się:
Aby zabić proces działający na porcie, po prostu dodaj przełącznik -k.
Przykład (port to 8888):
Otóż to! Zamknie to proces nasłuchiwania na porcie. Zwykle robię to przed uruchomieniem aplikacji serwera.
źródło
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?
źródło
W systemie Windows najpierw wyszukaj PID z numerem portu
Następnie zabij zadanie, upewnij się, że jesteś w katalogu głównym dysku „c”, a polecenie będzie
taskkill /F /PID your pid
źródło
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
Po wyświetleniu monitu naciśnij y.
Dzięki
źródło