Jakiego polecenia używa się do wyjścia? (tj. zakończ proces Node.js)
Jakiego polecenia używa się do wyjścia? (tj. zakończ proces Node.js)
Odpowiedzi:
Wywołaj metodę process
obiektu globalnego exit
:
process.exit()
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
.
exit
wcale 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.
mod_php
ani 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.
process.exit()
jest to zalecane , jak opisano w poniższej odpowiedzi .
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; }
process.exit()
jest przeznaczony.
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);
code = 0; process.exit(code);
code
?
process.exit()
brak parametru, ponieważ kod ma domyślną wartość 0
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.js
vs node exit_0.js
(możesz to sprawdzić, wykonując, node exit_1.js
a następnie wykonując echo $?
).
Jeśli korzystasz z terminala Unix lub wiersza poleceń systemu Windows i chcesz wyjść z NPL REPL, albo ...
.exit
i naciśnij Enter lubnode
REPL, Ctrl + D, aby wyjść, jest standardowym zachowaniem, więc działa również w systemie Windows.
Z wiersza poleceń .exit
jest 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])
.
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 doprocess.stdout
iprocess.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.exitCode
Nieruchomość 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()
:
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.exitCode
dowolnego wyniku do wywołania procesu wywoływania.
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.
Zawsze lepiej throw
jest 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.
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')
REPL (wiersz poleceń)
Naciśnij ctrl + c
dwa razy
Wpisz .exit
i 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
Mam aplikację, którą chciałem:
Musiałem podpiąć się process.exit(code)
do exit
moduł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); });
process.exitCode
do 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.
process.exitCode = 1
, proces kończy się kodem 0.
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");
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
Z kodu możesz użyć process.exit([errorcode])
gdzie [errorcode]
jest opcjonalną liczbą całkowitą ( 0
domyś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
node --version
v0.10.18
Naciśnij Ctrl + C
dwukrotnie lub .exit
.
>
(To exit, press ^C again or type .exit)
>
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!
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 ()
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
jeśli chcesz wyjść z aplikacji węzła js, to napisz
process.exit(1)
w twoim kodzie
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”.
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”.
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.
end()
to poprosić. W przeciwnym razie po prostu się zawiesi.