Jak wyjść z Node.js

1866

Jakiego polecenia używa się do wyjścia? (tj. zakończ proces Node.js)

Bryan Field
źródło

Odpowiedzi:

2375

Wywołaj metodę processobiektu globalnego exit:

process.exit()

Z dokumentów:

process.exit ([kod])

Kończy proces z określonym code. Jeśli zostanie pominięty, exit używa kodu „sukces” 0.

Aby wyjść z kodem „błąd”:

process.exit(1);

Powłoka, która wykonała węzeł, powinna widzieć kod wyjścia jako 1.

Pero P.
źródło
5
Po prostu chcę coś dodać. Jeśli zajmujesz się wnioskiem, powinieneś również o end()to poprosić. W przeciwnym razie po prostu się zawiesi.
pixelfreak,
126
@pixelfreak, exitwcale nie wprowadza w błąd. Jesteś zdezorientowany, jak działa Węzeł. Pomyśl o Node jak o samym serwerze. Nie jest uruchamiany tylko w razie potrzeby, podobnie jak PHP znajduje się na serwerze WWW takim jak Apache. Węzeł wcale nie musi mieć nic wspólnego z serwerami WWW! To tylko host dla JavaScript, z kilkoma fajnymi wbudowanymi bibliotekami do robienia użytecznych rzeczy.
Brad
6
@Brad And PHP to język ogólnego przeznaczenia. Nie trzeba go uruchamiać mod_phpani używać Apache. Możesz zaimplementować httpd w PHP tak, jak robi to node, jeśli naprawdę chcesz lub zastosować bardziej rozsądne / standardowe podejście, takie jak FastCGI, tak jak możesz to zrobić w węźle.
binki
38
Pamiętaj, że nieprocess.exit() jest to zalecane , jak opisano w poniższej odpowiedzi .
AndreasPizsa
409

Tylko uwaga, że używanie nieprocess.exit([number]) jest zalecaną praktyką.

Wywołanie process.exit () zmusi proces do wyjścia tak szybko, jak to możliwe, nawet jeśli nadal trwają operacje asynchroniczne, które nie zostały jeszcze w pełni zakończone, w tym operacje We / Wy do process.stdout i process.stderr.

W większości sytuacji tak naprawdę nie jest konieczne jawne wywołanie process.exit (). Proces Node.js zakończy się samodzielnie, jeśli w pętli zdarzeń nie będzie żadnych dodatkowych prac. Właściwość process.exitCode można ustawić tak, aby informowała proces, którego kodu wyjścia należy użyć, gdy proces zakończy się płynnie.

Na przykład poniższy przykład ilustruje niewłaściwe użycie metody process.exit (), które może prowadzić do obcinania i utraty danych drukowanych na standardowe wyjście:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

Powodem tego jest problem, ponieważ zapis do process.stdout w Node.js jest czasami asynchroniczny i może występować przy wielu tyknięciach w pętli zdarzeń Node.js. Wywołanie process.exit () wymusza jednak zakończenie procesu przed wykonaniem tych dodatkowych zapisów na standardowe wyjście.

Zamiast wywoływać bezpośrednio proces.exit (), kod powinien ustawić proces.exitCode i pozwolić procesowi wyjść naturalnie, unikając planowania dodatkowej pracy dla pętli zdarzeń:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}
Dominik
źródło
31
Jak dotąd najlepsza odpowiedź. Inne odpowiedzi mogą nie pozwolić, aby węzeł poprawnie przetwarzał zdarzenia oczekujące przed wyjściem, bardzo smutne :(
djabraham
3
Zgadzam się, to powinno mieć więcej pozytywnych opinii! Miałem skrypt węzła uruchamiający wiele procesów potomnych za pośrednictwem shelljs.exec i chciałem, aby mój ogólny skrypt zwrócił kod błędu wyjścia, jeśli którykolwiek z procesów potomnych się nie powiedzie. process.exitCode = 1 świetnie działał w wywołaniach zwrotnych exec (podczas gdy po prostu wywołanie process.exit (1) tam zamknęłoby główny skrypt przed zakończeniem wszystkich procesów potomnych!)
Nick
15
Użyłem tej odpowiedzi i okazało się, że mój proces nigdy się nie zakończył. Musiałem ctrl-C to.
jcollum
33
Istnieje wiele przypadków użycia do natychmiastowego zakończenia procesu i zakończenia zdarzenia. Właśnie do tego process.exit()jest przeznaczony.
Dominic Cerisano
6
To nie jest najlepsza odpowiedź pod żadnym względem, ponieważ nie odpowiada na pytanie. Zamiast tego zawiera najlepsze praktyki dotyczące programowania przepływu kodu dla programu nodejs.
anon58192932
365

Z oficjalnej dokumentacji nodejs.org :

process.exit(code)

Kończy proces z określonym kodem. Jeśli zostanie pominięty, exit używa kodu „sukces” 0.

Aby wyjść z kodem „błąd”:

process.exit(1);
alienhard
źródło
9
@Alison tak, a ściślejcode = 0; process.exit(code);
wprl
7
Czy to prawda, że ​​jeśli wychodzisz, prawdopodobnie nie zależy ci na wartości code?
Armand
8
@Alison Lepszym pomysłem jest po prostu process.exit()brak parametru, ponieważ kod ma domyślną wartość 0
Jeremy Moritz
2
@Armand Masz rację - Kod jest tylko zmienną, w tym przypadku służy do wskazania, jaki jest parametr. Tak więc .exit (0) robi wszystko, co robi przykład.
Gerard ONeill
23
@Armand kod nie jest dla ciebie, jest przeznaczony do wszystkiego, co uruchomiło Twój kod. Na przykład, jeśli utworzysz plik exit_0.js za pomocą process.exit(0);i uruchomisz go node exit_0.js && echo 'success', powie „sukces”. Jeśli utworzysz plik exit_1.js za pomocą process.exit(1);i uruchomisz node exit_1.js && echo 'success'go, nie powie on „sukces”, ponieważ proces zakończył się z niezerową wartością (co oznacza „niepowodzenie” lub „nieprawidłowe wyjście” do powłoki). Ponadto zobaczysz różne wartości, $?jeśli uruchomisz node exit_1.jsvs node exit_0.js(możesz to sprawdzić, wykonując, node exit_1.jsa następnie wykonując echo $?).
msouth
277

Jeśli korzystasz z terminala Unix lub wiersza poleceń systemu Windows i chcesz wyjść z NPL REPL, albo ...

  • Naciśnij dwukrotnie Ctrl+ Club
  • wpisz .exiti naciśnij Enter lub
  • naciśnij Ctrl+ Dna początku linii (tylko Unix)
Mohsen
źródło
14
Zauważ, że poza Node, skrót Ctrl + D na Macu lub Linuksie działa na prawie wszystkich powłokach i REPL, jakie kiedykolwiek napotkasz, w tym powłokach uniksowych, takich jak Bash, powłokach baz danych, takich jak MySQL i PostgreSQL, oraz REPL dla języków programowania, takich jak Python, PHP i Ruby. Jest to jedyna metoda wychodzenia z muszli, jakiej kiedykolwiek używałem.
Mark Amery
2
W przypadku nodeREPL, Ctrl + D, aby wyjść, jest standardowym zachowaniem, więc działa również w systemie Windows.
Alan
Naciśnij Ctrl + C (nawet na komputerze Mac!)
Prince
124

Z wiersza poleceń .exitjest to, czego chcesz:

$ node
> .exit
$

Jest to udokumentowane w dokumentach REPL . REPL (Read-Eval-Print-Loop) to tak zwana linia poleceń Node.

Z normalnego programu użyj process.exit([code]).

Mike M. Lin
źródło
79

Zależy to od powodu, dla którego chcesz wyjść z procesu node.js, ale w każdym razie process.exit()jest to ostatnia rozważana opcja . Cytat z dokumentacji:

Należy zauważyć, że wywołanie process.exit()zmusi proces do wyjścia tak szybko, jak to możliwe, nawet jeśli nadal trwają operacje asynchroniczne, które nie zostały jeszcze w pełni zakończone, w tym operacje we / wy do process.stdouti process.stderr.

W większości sytuacji tak naprawdę nie jest konieczne process.exit()jawne dzwonienie . Proces Node.js zakończy się sam, jeśli w pętli zdarzeń nie będzie żadnych dodatkowych prac. process.exitCodeNieruchomość może być ustawiony, aby powiedzieć procesu, którego kod wyjścia do korzystania Po wyjściu procesu wdziękiem.

Omówmy możliwe powody, dla których możesz chcieć wyjść z procesu node.js i dlaczego powinieneś unikać process.exit():

Przypadek 1 - Wykonanie zakończone (skrypt wiersza poleceń)

Jeśli skrypt osiągnął koniec, a interpreter węzła nie kończy działania, oznacza to, że niektóre operacje asynchroniczne są nadal w toku. W process.exit()tym momencie niewłaściwe jest wymuszanie zakończenia procesu . Lepiej spróbuj zrozumieć, co powstrzymuje skrypt przed wyjściem w oczekiwany sposób . Po rozwiązaniu tego problemu możesz użyć process.exitCodedowolnego wyniku do wywołania procesu wywoływania.

Przypadek 2 - Zakończenie z powodu sygnału zewnętrznego (SIGINT / SIGTERM / other)

Na przykład, jeśli chcesz z wdziękiem zamknąć aplikację ekspresową . W przeciwieństwie do skryptu wiersza poleceń, aplikacja ekspresowa działa bez końca, czekając na nowe żądania. process.exit()będzie złą opcją tutaj, ponieważ spowoduje to przerwanie wszystkich oczekujących wniosków. Niektóre z nich mogą nie być idempotentne (UPDATE, DELETE). Klient nigdy nie będzie wiedział, czy żądania te zostały zakończone, czy nie po stronie serwera i może to być przyczyną niespójności danych między klientem a serwerem. Jedynym dobrym rozwiązaniem jest powiadomienie serwera HTTP, aby przestał akceptować nowe żądania i czekał na zakończenie oczekujących server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Jeśli nadal nie wychodzi - patrz przypadek 1.

Przypadek 3 - Błąd wewnętrzny

Zawsze lepiej throwjest popełnić błąd, otrzymasz ładnie sformatowany ślad stosu i komunikat o błędzie. Górne poziomy kodu zawsze mogą decydować, czy poradzą sobie z błędem ( catch), czy też mogą zawiesić proces. Z drugiej strony, process.exit(1)proces zostanie cicho zakończony i nie będzie szans na odzyskanie po tym. Może to być jedyna „korzyść” process.exit(), możesz mieć pewność, że proces zostanie zakończony.

teq
źródło
4
Niesamowita odpowiedź. Process.exit()wygląda na dużą nadwyżkę w przypadku większości aplikacji. Szukałem odpowiednika funkcji die () php ... więcej takich jak:throw new Error('die msg')
AvadData
Jeśli ktoś ma sporo kodu, który powinien być wykonywany w sposób ciągły do ​​momentu otrzymania żądania zamknięcia, czy istnieje jakaś fajna konwencja do rejestrowania zdarzeń, która pozwoliłaby na rezygnację z subskrypcji w odpowiedzi na żądanie zamknięcia, bez konieczności używania kodu przez zdarzenia czy kod żądający zamknięcia ma określoną wiedzę o sobie? Niestety, jedyny sposób, w jaki mogę wymyślić coś w rodzaju implementacji, która wymagałaby, aby każdy fragment kodu rejestrujący zdarzenie tworzył również opakowanie zawierające zamknięcie umożliwiające jego wyrejestrowanie.
supercat
26

REPL (wiersz poleceń)

  • Naciśnij ctrl + c dwa razy

  • Wpisz .exiti naciśnij enter

Plik skryptu

process.exit(code)

Węzeł zwykle kończy działanie z kodem 0, gdy nie ma już żadnych operacji asynchronicznych.

process.exit(1) powinien zostać użyty do wyjścia z kodem błędu. Pozwoli nam to wnioskować, że węzeł nie zamknął się płynnie i został zmuszony do zamknięcia.

Istnieją inne kody wyjścia, takie jak

3 - Wewnętrzny błąd analizy JavaScript (bardzo bardzo rzadko)

5 - Błąd krytyczny w silniku javascript v8

9 - Niepoprawny argument

Pełna lista znajduje się w kodach wyjścia węzłów

Siva Prakash
źródło
12

Mam aplikację, którą chciałem:

  1. Wyślij wiadomość e-mail do użytkownika
  2. Wyjdź z kodem błędu

Musiałem podpiąć się process.exit(code)do exitmodułu obsługi zdarzeń, w przeciwnym razie poczta nie zostanie wysłana, ponieważ process.exit(code)bezpośrednie wywołanie zabija zdarzenia asynchroniczne.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });
Stephen Quan
źródło
4
Myślę, że chcesz process.exitCode
Julian de Bhal
Dla przypomnienia: spędziłem sporą część dnia, próbując dostać się process.exitCodedo pracy w narzędziu wiersza polecenia, które buduję (testowane na Node v4.3.0). Ale nie mogłem sprawić, żeby zachowało się jak udokumentowane. To bardzo dobrze mogło być przypadkowe commander- chociaż github.com/tj/commander.js/… mnie zastanawia. Nie jestem pewien, czy ktoś jeszcze nie widział tego problemu z Węzłem 4, ale dokumentowanie na wszelki wypadek do wykorzystania w przyszłości.
mikermcneil
Jeśli chodzi o możliwość, że to pochodzi od dowódcy, również spojrzałem na jego jedyną dep ( github.com/zhiyelee/graceful-readlink/… ), ale bez kości. Wydaje się, że tylko możliwy winowajca może: github.com/tj/commander.js/blob/… Problem polega na tym, że nawet jeśli ustawisz process.exitCode = 1, proces kończy się kodem 0.
mikermcneil
10

Jak wskazał @Dominic, zgłoszenie nieprzechwyconego błędu jest lepszą praktyką niż wywoływanie process.exit ([kod]) :
process.exitCode = 1; throw new Error("my module xx condition failed");

MANN
źródło
3
W kontekście pytania „Jak wyjść z Node.js” jest to okropna rada. Twoja sugestia byłaby o wiele bardziej sensowna, gdyby pytanie dotyczyło konkretnie wyjścia z błędu. Zdecydowanie sugeruję sformułowanie odpowiedzi w taki sposób, aby wskazać, że użytkownik robi to, co sugerujesz, tylko wtedy, gdy próbuje wyjść z aplikacji w przypadku błędu .
rstackhouse
@rstackhouse, mam nadzieję, że przeszedłeś przez rzucanie nieprzechwyconego błędu, który wskazuje na -> nodejs.org/api/process.html#process_process_exit_code
MANN
4
Problem z rzucaniem jest brzydki jak ślad stosu piekieł. Czy jest jakaś wskazówka, aby uniknąć tego śledzenia stosu (nie dotyczy, gdy narzędzie CLI chce wyjść, jeśli użycie jest nieprawidłowe)?
MoOx
9

Do wyjścia

let exitCode = 1;
process.exit(exitCode)

Przydatne kody wyjścia

1 - Catchall dla ogólnych błędów
2 - Niewłaściwe użycie wbudowanych powłok (zgodnie z dokumentacją Bash)
126 - Wywołane polecenie nie może zostać wykonane
127 - „nie znaleziono polecenia”
128 - Niepoprawny argument do wyjścia
128 + n - sygnał błędu krytycznego „n”
130 - Skrypt zakończony przez Control-C
255 \ * - Wyjdź ze stanu poza zakresem
Denis Lisitskiy
źródło
Zastanów się nad zaktualizowaniem swojej odpowiedzi, nodejs.org/api/process.html#process_process_exit_code
Cmag
7

Z kodu możesz użyć process.exit([errorcode])gdzie [errorcode]jest opcjonalną liczbą całkowitą ( 0domyślnie wskazuje sukces).

Jeśli korzystasz z Read Eval Print Loop (REPL) , możesz użyć Ctrl+ Dlub wpisać.exit

Alternatywnie, w systemie Windows lub Linux możesz użyć Ctrl+ C, Ctrl+C

Na Macu polecenie to Ctrl+ Z, Ctrl+Z

zzzzBov
źródło
2
Dwie kontrolki c działają również na node --version v0.10.18
Macu
Control-C nie wydaje się anulować operacji, które zostały już zaplanowane, podczas gdy ctrl-z zabija proces bezzwłocznie na Macu.
jorisw
7

Naciśnij Ctrl + Cdwukrotnie lub .exit.

> 
(To exit, press ^C again or type .exit)
> 
HeadAndTail
źródło
3

Udało mi się zmusić wszystkie procesy węzłów do śmierci bezpośrednio z powłoki Git Bash w systemie Windows 10, wpisując taskkill -F -IM node.exe- to kończy wszystkie procesy węzła na moim komputerze naraz. Odkryłem, że mogę również użyć taskkill //F //IM node.exe. Nie wiem, dlaczego zarówno -i //praca w tym kontekście. Mam nadzieję że to pomoże!

Alison Stuart
źródło
Wynika to z samego zadania. Zabijacie sami procesy. Również pojedynczy / jest wystarczający.
Paul Stelian,
2

Ponieważ proces jest obiektem globalnym, nie musisz importować żadnego modułu. Poniższa funkcja kończy lub zabija bieżący proces węzła.

process.exit (kod)

process.kill (process.pid)

process.abort ()

sumit_suthar
źródło
1

Otwórz terminal wiersza poleceń, w którym działa aplikacja węzła, i naciśnij Ctrl + C

jeśli chcesz zamknąć aplikację węzła js z kodu,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 
Shekar Mania
źródło
0

jeśli chcesz wyjść z aplikacji węzła js, to napisz

process.exit(1)

w twoim kodzie

Ajay Mudaliyar
źródło
3
1 służy do wskazania błędu w aplikacji, który inne odpowiedzi już wyjaśniają.
Herick,
0

Wyjście w węźle js odbywa się na dwa sposoby:

  • Wywołanie jawnie procesu.exit () .
  • Lub, jeśli pętla zdarzeń nodejs jest wykonywana ze wszystkimi zadaniami i nie ma już nic do zrobienia. Następnie aplikacja węzła zostanie automatycznie zamknięta.

Jak to działa?

Jeśli chcesz zmusić pętlę wykonawczą do zatrzymania procesu, możesz użyć procesu zmiennej globalnej , który jest instancją EventEmitter . Kiedy więc wywołujesz process.exit () , faktycznie emitujesz zdarzenie wyjściowe , które natychmiast kończy wszystkie zadania, nawet jeśli nadal nie zostały wykonane operacje asynchroniczne.

process.exit () przyjmuje jako parametr kod zakończenia (Integer). Kod 0 jest domyślny, co oznacza, że ​​kończy się „sukcesem”. Podczas gdy kod 1 oznacza, że ​​kończy się z „niepowodzeniem”.

majid jiji
źródło
0

Jeśli jesteś w systemie Windows, przejdź do Menedżera zadań, a następnie przejdź do Procesy, poszukaj procesu o nazwie „węzeł”, następnie kliknij go prawym przyciskiem myszy, a następnie kliknij opcję „Zakończ proces”.

Albos Hajdari
źródło
-1

Możesz użyć funkcji process.exit ([kod]) .

Jeśli chcesz wyjść bez „awarii”, użyj kodu 0:

process.exit(0);

Aby wyjść z kodem „błąd” 1, możesz uruchomić:

process.exit(1);

Kod „awarii” awarii jest specyficzny dla aplikacji. Możesz więc użyć do tego własnych konwencji.

Oleksii Trekhleb
źródło