Яка команда використовується для виходу? (тобто завершити процес Node.js)
Яка команда використовується для виходу? (тобто завершити процес Node.js)
Відповіді:
Виклик методу глобального process
об'єкта exit
:
process.exit()
process.exit ([код])
Закінчується процес вказаним
code
. Якщо цей пункт пропущено, для виходу використовується код "успіх"0
.Щоб вийти з кодом "провал":
process.exit(1);
Оболонка, що виконувала вузол, повинна бачити код виходу як
1
.
exit
зовсім не вводить в оману. Вас бентежить, як працює Вузол. Подумайте про Node як про сам сервер. Це не просто запускається за потребою, як PHP знаходиться на веб-сервері, як Apache. Вузол взагалі не повинен мати нічого спільного з веб-серверами! Це просто хост для деякого JavaScript, з чудовими вбудованими бібліотеками для корисних справ.
mod_php
або використовувати Apache. Ви можете повторно реалізувати httpd у PHP, як node, якщо ви дійсно хочете або використовуєте більш здоровий / стандартизований підхід, як FastCGI, як ви можете у вузлі.
process.exit()
це не рекомендується , як описано у цій відповіді нижче .
Просто до відома , що використання process.exit([number])
є не рекомендується практика.
Виклик
process.exit()
змусить процес вийти якнайшвидше, навіть якщо є ще асинхронні операції, що очікують на розгляд, які ще не завершилися повністю, включаючи операції вводу / виводу доprocess.stdout
таprocess.stderr
.У більшості ситуацій
process.exit()
явно телефонувати не потрібно . Процес Node.js завершиться самостійно, якщо в циклі подій не очікується додаткова робота.process.exitCode
Властивість може сказати процес, вихід код для використання , коли процес завершується коректно.Наприклад, наступний приклад ілюструє зловживання цього
process.exit()
способу , який може привести до даних , надрукованих вstdout
усікається і втратив:// This is an example of what *not* to do: if (someConditionNotMet()) { printUsageToStdout(); process.exit(1); }
Причина цього проблемна в тому, що записування
process.stdout
в Node.js іноді є асинхронним і може виникати через декілька тиків циклу подій Node.js.process.exit()
Однак виклик змушує процес вийти до того, якstdout
можна буде виконати ці додаткові записи .Замість того, щоб
process.exit()
безпосередньо телефонувати , код повинен встановлюватиprocess.exitCode
та дозволяти процесу виходити природним шляхом, уникаючи планування будь-яких додаткових робіт для циклу подій:// How to properly set the exit code while letting // the process exit gracefully. if (someConditionNotMet()) { printUsageToStdout(); process.exitCode = 1; }
process.exit()
і призначене.
З офіційної документації на nodejs.org :
process.exit(code)
Закінчується процес вказаним кодом. Якщо цей пункт пропущено, для виходу використовується код "успіх" 0.
Щоб вийти з кодом "провал":
process.exit(1);
code = 0; process.exit(code);
code
?
process.exit()
без параметра, оскільки код за замовчуванням до 0
process.exit(0);
і запустите його, node exit_0.js && echo 'success'
він скаже "успіх". Якщо ви створите exit_1.js за допомогою process.exit(1);
та запустіть, node exit_1.js && echo 'success'
це не скаже "успіх", оскільки ваш процес закінчився з нульовим значенням (що вказує на "збій" або "ненормальний вихід" в оболонку). Крім того, ви побачите різні значення в тому $?
випадку, якщо ви запускаєте node exit_1.js
vs node exit_0.js
(ви можете перевірити, зробивши, node exit_1.js
а потім зробивши echo $?
).
Якщо ви знаходитесь в терміналі Unix або командному рядку Windows і хочете вийти з вузла REPL, будь-який ...
.exit
і натисніть Enter, абоnode
REPL Ctrl + D для виходу є стандартною поведінкою, тому він також працює в Windows.
З командного рядка .exit
ви хочете:
$ node
> .exit
$
Це задокументовано в документах REPL . REPL (Read-Eval-Print-Loop) - так називається командний рядок Node.
У звичайній програмі використовуйте process.exit([code])
.
Це залежить від причини, чому ви готові вийти з процесу node.js, але в будь-якому випадку process.exit()
це останній варіант, який слід розглянути . Цитата з документації:
Важливо зауважити, що виклик
process.exit()
змусить процес вийти якнайшвидше, навіть якщо очікують ще асинхронні операції, які ще не завершені повністю, включаючи операції вводу / виводу доprocess.stdout
таprocess.stderr
.У більшості ситуацій
process.exit()
явно телефонувати не потрібно . Процес Node.js вийде самостійно, якщо в циклі подій не очікується додаткова робота.process.exitCode
Властивість може сказати процес, вихід код для використання , коли процес завершується коректно.
Розкриємо можливі причини, через які ви могли б вийти з процесу node.js і чому вам слід уникати process.exit()
:
Якщо скрипт досяг свого кінця, а інтерпретатор вузла не виходить, це вказує на те, що деякі операції з асинхронізацією ще тривають. На process.exit()
цьому етапі неправильно змушувати припиняти процес . Краще спробувати зрозуміти, що стримує вихід сценарію очікуваним чином . І коли ви вирішите це, ви можете використовувати process.exitCode
для повернення будь-якого результату до процесу виклику.
Наприклад, якщо ви готові виграшно вимкнути експрес- додаток. На відміну від сценарію командного рядка, експрес-додаток нескінченно працює, чекаючи нових запитів. process.exit()
тут буде поганим варіантом, оскільки він перерве всі запити, які знаходяться на стадії розробки. І деякі з них можуть бути неідентичними (ОНОВЛЕННЯ, УДАЛИТИ). Клієнт ніколи не дізнається, чи завершено ці запити на стороні сервера, і це може бути причиною невідповідності даних між клієнтом і сервером. Єдине хороше рішення - сказати http-серверу припинити приймати нові запити і чекати, поки ті, що очікують, закінчать 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");
});
});
Якщо вона все ще не виходить - див. Справа 1.
Завжди краще до throw
помилки, ви отримаєте добре відформатоване трасування стека та повідомлення про помилку. Верхній рівень коду завжди може вирішити, чи можуть вони обробити помилку ( catch
) чи дозволити їй руйнувати процес. З іншого боку, process.exit(1)
процес мовчки припиниться, і шансів на відновлення після цього не буде. Це може бути єдиною «перевагою» process.exit()
, ви можете бути впевнені, що процес буде припинено.
Process.exit()
схоже на великий надлишок для більшості програм. Я шукав еквівалент функції php's die () ... більше на кшталт:throw new Error('die msg')
REPL (командний рядок)
Натисніть ctrl + c
двічі
Введіть .exit
та натисніть клавішу Enter
Файл сценарію
process.exit(code)
Вузол зазвичай виходить з кодом 0 коли не очікується більше операцій з асинхронізацією.
process.exit(1)
слід використовувати для виходу з кодом відмови. Це дозволить нам зробити висновок про те, що вузол не закрився витончено і був змушений закритися.
Існують і інші вихідні коди на кшталт
3 - Внутрішня помилка розбору JavaScript (дуже дуже рідко)
5 - Фатальна помилка в двигуні javascript v8
9 - Неправильний аргумент
Повний список див. У кодах виходу вузлів
У мене є програма, яку я хотів:
Мені довелося підключитися process.exit(code)
до exit
обробника подій, інакше пошта не буде відправлена, оскільки дзвінок process.exit(code)
безпосередньо вбиває асинхронні події.
#!/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
на роботу в інструмент командного рядка, який я будую (протестований на Node v4.3.0). Але я не міг змусити його поводитись як задокументовано. Це дуже добре могло бути кращим випадком commander
- хоча github.com/tj/commander.js/… змушує мене замислитися. Не впевнений, чи бачив хтось інший цю проблему без вузла 4, але документував про всяк випадок для подальшого використання.
process.exitCode = 1
, процес закінчується кодом 0.
Як зазначав @Dominic, кидати невиконану помилку - це краща практика замість виклику process.exit ([код]) :
process.exitCode = 1;
throw new Error("my module xx condition failed");
Для виходу
let exitCode = 1;
process.exit(exitCode)
Корисні коди виходу
1 - Catchall для загальних помилок 2 - Неправильне використання вбудованих оболонок (згідно документації Bash) 126 - Команда, яку викликається, не може виконати 127 - "команда не знайдена" 128 - Недійсний аргумент для виходу 128 + n - фатальний сигнал помилки “n” 130 - Сценарій, скасований Control-C 255 \ * - Вихід із поза діапазону
З коду ви можете використовувати process.exit([errorcode])
де [errorcode]
необов’язкове ціле число ( 0
за замовчуванням вказує на успіх).
Якщо ви використовуєте цикл друку Read Eval (REPL) , ви можете використовувати Ctrl+ Dабо ввести.exit
Крім того, в Windows або Linux можна використовувати Ctrl+ C, Ctrl+C
У Mac команда Ctrl+ Z, Ctrl+Z
node --version
v0.10.18
Натисніть Ctrl + C
двічі або .exit
.
>
(To exit, press ^C again or type .exit)
>
Мені вдалося змусити всі мої вузлові процеси померти безпосередньо з оболонки Git Bash в Windows 10, набравши taskkill -F -IM node.exe
- це закінчує всі процеси вузлів на моєму комп’ютері одразу. Я виявив, що також можу скористатися taskkill //F //IM node.exe
. Не впевнений, чому обидва -
і //
працюють у цьому контексті. Сподіваюся, це допомагає!
Оскільки процес є глобальним об'єктом, вам не потрібно імпортувати жоден модуль. Наступна функція закриває або вбиває поточний процес вузла.
process.exit (код)
process.kill (process.pid)
process.abort ()
Відкрийте термінал командного рядка, де працює програма вузла, і натисніть Ctrl + C
якщо ви хочете вийти з програми js вузла з коду,
process.exit(); // graceful termination
process.exit(1); // non graceful termination
якщо ви хочете вийти з програми njs js, тоді пишіть
process.exit(1)
у вашому коді
Якщо ви хочете змусити цикл виконання зупинити процес, yo може використовувати глобальний змінний процес, який є примірником EventEmitter . Тож, коли ви викликаєте process.exit (), ви фактично випромінюєте подію виходу, яка закінчує всі завдання негайно, навіть якщо все ще існують асинхронні операції.
process.exit () приймає в якості параметра вихідний код (Integer). Код 0 за замовчуванням, це означає, що він виходить із «успіхом». У той час як код 1 означає, що він виходить із "провалом".
Якщо ви перебуваєте в Windows, перейдіть до диспетчера завдань, потім перейдіть до процесів, шукайте процес під назвою "вузол", потім натискайте на нього правою кнопкою миші та натисніть опцію "Завершити процес".
Ви можете використовувати функцію process.exit ([код]) .
Якщо ви хочете вийти без "відмови", ви використовуєте код 0
:
process.exit(0);
Для виходу з кодом "відмови" 1
ви можете запустити:
process.exit(1);
Код "відмови" відмови характерний для програми. Тож ви можете використовувати для цього свої власні умовності.
end()
запит. Інакше він просто зависне.