Węzeł Stop.program js z linii poleceń

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. Kiedy próbuję uruchomić go ponownie z node server.js pojawia się 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?
Author: Eleeist, 2012-05-09

13 answers

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

Zobacz też: https://superuser.com/a/262948/48624

 324
Author: Brad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-20 10:18:16

Ctrl+Z zawiesza go, co oznacza, że nadal może działać.

Ctrl+C naprawdę go zabije.

Można go również zabić ręcznie w ten 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
 271
Author: Jamund Ferguson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 14:43:23

Lub alternatywnie możesz zrobić to wszystko w jednej linii:

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

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

 30
Author: Hamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-22 15:44:32

Możesz wpisać .exit aby zamknąć węzeł JS REPL

 21
Author: sunny1304,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 10:12:09

Jeśli używasz Node.js interactive (the REPL):

Ctrl + C przeniesie cię z powrotem do > prompt, a następnie wpisz:

process.exit()

Lub po prostu użyj Ctrl + D .

 16
Author: sr77in,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-07 15:38:43

$ sudo killall node w innym terminalu działa na mac , natomiast killall node nie działa:

$ killall node
No matching processes belonging to you were found
 13
Author: Maxim Yefremov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 12:53:26

Wznów i zakończ proces:

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

prawdopodobnie jesteś teraz na monicie terminala...

  1. Polecenie fg, Aby wznowić proces na pierwszym planie.

  2. Type Ctrl+C , aby go właściwie zabić.


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

(Uwaga: poniższe polecenia mogą wymagać roota, więc sudo ... jest twoim przyjacielem)

pkill -9 node

Lub, jeśli nie masz pkill, może to zadział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 i jego komentarz pomógł mi rozwiązać go osobiście.

 11
Author: Metagrapher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 21:48:40

Choć jest to późna odpowiedź, znalazłem to z NodeJS docs:

Zdarzenie' exit 'jest emitowane, gdy REPL jest wyłączony przez odebranie .exit jako wejście, przez dwukrotne naciśnięcie <ctrl>-C, aby sygnalizować SIGINT, lub przez naciśnięcie <ctrl>-D, aby sygnalizować' end ' w strumieniu wejściowym. Wywołanie zwrotne listener jest wywoływane bez żadnych argumentów.

Więc podsumowując można wyjść przez:

  1. wpisując {[0] } W nodejs REPL.
  2. naciśnięcie <ctrl>-C dwa razy.
  3. naciśnięcie <ctrl>-D.
  4. process.exit(0) czyli naturalne wyjście z REPL. Jeśli chcesz zwrócić inny status, możesz zwrócić liczbę niezerową.
  5. process.kill(process.pid) jest sposobem zabijania przy użyciu api nodejs z kodu lub z REPL.
 4
Author: randominstanceOfLivingThing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-06 22:22:10

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'])
 4
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 18:26:21

Jeśli chcesz zatrzymać serwer npm stop lub coś takiego. Możesz napisać kod, który zabija proces serwera jako:

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

Sprawdź ten link dla szczegółów: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

 2
Author: BigEgg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 03:06:12

Napotkałem problem, w którym mamuruchomionych wiele serwerów węzłów i chcępo prostu zabić jednego z nich i ponownie pobrać go ze skryptu.

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

Aby to zrobić, upewniam się, że mój telefon node jest jak najbardziej szczegółowy. Na przykład zamiast wywoływać node server.js z katalogu apps, wywołuję node app_name_1/app/server.js

Wtedy mogę go zabić używając:

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

To zabije tylko uruchomiony proces węzła app_name_1 / app / server.js.

Jeśli uruchomiłeś node app_name_2/app/server.js ten proces węzła będzie nadal działał.

Jeśli zdecydujesz, że chcesz ich wszystkich zabić, możesz użyć killall node, Jak wspominali inni.

 2
Author: bapin93,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 02:51:20

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 pakietu forever (z NPM).

Przykład:

Install Forever

npm install forever -g

Uruchom Serwer Węzła

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

Wynik:

info: Forever processing file: server.js

Węzeł Zamykania Serwer

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 całkowite zamknięcie aplikacji serwera.

 2
Author: Decoded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-08 18:40:00

Mój przypadek użycia: na MacOS Uruchom / rerun wiele serwerów węzłów na różne porty ze skryptu

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

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

Stop2, stop3...

Rerun: "stop1 & stop2 & ... & stopN ; run

Aby uzyskać więcej informacji na temat znajdowania procesu przez port: Kto nasłuchuje na danym porcie TCP w Mac OS X?

 0
Author: Edan Chetrit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 16:47:29