Як вийти в Node.js


1866

Яка команда використовується для виходу? (тобто завершити процес Node.js)

Відповіді:


2375

Виклик методу глобального processоб'єкта exit:

process.exit()

З документів:

process.exit ([код])

Закінчується процес вказаним code. Якщо цей пункт пропущено, для виходу використовується код "успіх" 0.

Щоб вийти з кодом "провал":

process.exit(1);

Оболонка, що виконувала вузол, повинна бачити код виходу як 1.


5
Просто хочу щось додати. Якщо ви обробляєте запит, вам також слід також end()запит. Інакше він просто зависне.
pixelfreak

126
@pixelfreak, exitзовсім не вводить в оману. Вас бентежить, як працює Вузол. Подумайте про Node як про сам сервер. Це не просто запускається за потребою, як PHP знаходиться на веб-сервері, як Apache. Вузол взагалі не повинен мати нічого спільного з веб-серверами! Це просто хост для деякого JavaScript, з чудовими вбудованими бібліотеками для корисних справ.
Бред

6
@Brad І PHP - мова загального призначення. Не потрібно запускати його mod_phpабо використовувати Apache. Ви можете повторно реалізувати httpd у PHP, як node, якщо ви дійсно хочете або використовуєте більш здоровий / стандартизований підхід, як FastCGI, як ви можете у вузлі.
бінкі

38
Зверніть увагу, що process.exit()це не рекомендується , як описано у цій відповіді нижче .
AndreasPizsa

409

Просто до відома , що використання 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;
}

31
Це найкраща відповідь, на сьогоднішній день. Інші відповіді можуть не дати вузлу належним чином обробити очікувані події перед виходом, дуже сумно :(
djabraham

3
Домовились, це повинно мати більше результатів! У мене був сценарій вузла, який запускав декілька дочірніх процесів через shelljs.exec, і я хотів, щоб мій загальний скрипт повернувся з кодом виходу помилки, якщо будь-який з дочірніх процесів не вдався. process.exitCode = 1 чудово працював у зворотному режимі виклику exec (тоді як просто виклик process.exit (1) там би вийшов з основного сценарію до того, як всі дочірні процеси будуть закінчені!)
Нік

15
Я використав цю відповідь і виявив, що мій процес ніколи не закінчувався. Довелося ctrl-C це.
jcollum

33
Існує багато випадків використання для негайного процесу та припинення події, що очікує. Саме це process.exit()і призначене.
Домінік Серісано

6
Це не найкраща відповідь на будь-який розтяг, оскільки вона не відповідає на питання. Натомість він дає найкращі практики щодо розробки потоку коду для програми nodejs.
anon58192932

365

З офіційної документації на nodejs.org :

process.exit(code)

Закінчується процес вказаним кодом. Якщо цей пункт пропущено, для виходу використовується код "успіх" 0.

Щоб вийти з кодом "провал":

process.exit(1);

9
@Alison так, а точнішеcode = 0; process.exit(code);
wprl

7
Це правда, що якщо ви виходите, ви, мабуть, не піклуєтесь про значення code?
Арман

8
@Alison Краща ідея - просто process.exit()без параметра, оскільки код за замовчуванням до 0
Джеремі Моріц,

2
@Armand Ви праві - Код - це просто змінна, і в цьому випадку використовується для вказівки, що таке параметр. Отже .exit (0) робить все, що робиться на прикладі.
Джерард ONeill

23
@Armand код не для вас, це для тих, хто керував вашим кодом. Наприклад, якщо ви створите exit_0.js з process.exit(0);і запустите його, node exit_0.js && echo 'success'він скаже "успіх". Якщо ви створите exit_1.js за допомогою process.exit(1);та запустіть, node exit_1.js && echo 'success'це не скаже "успіх", оскільки ваш процес закінчився з нульовим значенням (що вказує на "збій" або "ненормальний вихід" в оболонку). Крім того, ви побачите різні значення в тому $?випадку, якщо ви запускаєте node exit_1.jsvs node exit_0.js(ви можете перевірити, зробивши, node exit_1.jsа потім зробивши echo $?).
msouth

277

Якщо ви знаходитесь в терміналі Unix або командному рядку Windows і хочете вийти з вузла REPL, будь-який ...

  • Натисніть Ctrl+ Cдвічі або
  • введіть .exitі натисніть Enter, або
  • натисніть Ctrl+ Dна початку рядка (лише для Unix)

14
Зауважте, що поза Node, ярлик Ctrl + D на Mac або Linux працює майже на всіх оболонках і REPL, з якими ви коли-небудь стикаєтеся, включаючи оболонки Unix, як Bash, оболонки для баз даних, такі як MySQL і PostgreSQL, і відповідність для мов програмування, таких як Python, PHP та Ruby. Це єдиний метод виходу з оболонок, який я коли-небудь використовую.
Марк Амері

2
Для nodeREPL Ctrl + D для виходу є стандартною поведінкою, тому він також працює в Windows.
Алан

Натисніть Ctrl + C (навіть на Mac!)
Принц


79

Це залежить від причини, чому ви готові вийти з процесу node.js, але в будь-якому випадку process.exit()це останній варіант, який слід розглянути . Цитата з документації:

Важливо зауважити, що виклик process.exit()змусить процес вийти якнайшвидше, навіть якщо очікують ще асинхронні операції, які ще не завершені повністю, включаючи операції вводу / виводу до process.stdoutта process.stderr.

У більшості ситуацій process.exit()явно телефонувати не потрібно . Процес Node.js вийде самостійно, якщо в циклі подій не очікується додаткова робота. process.exitCodeВластивість може сказати процес, вихід код для використання , коли процес завершується коректно.

Розкриємо можливі причини, через які ви могли б вийти з процесу node.js і чому вам слід уникати process.exit():

Випадок 1 - Виконання завершено (сценарій командного рядка)

Якщо скрипт досяг свого кінця, а інтерпретатор вузла не виходить, це вказує на те, що деякі операції з асинхронізацією ще тривають. На process.exit()цьому етапі неправильно змушувати припиняти процес . Краще спробувати зрозуміти, що стримує вихід сценарію очікуваним чином . І коли ви вирішите це, ви можете використовувати process.exitCodeдля повернення будь-якого результату до процесу виклику.

Випадок 2 - Припинення через зовнішній сигнал (SIGINT / SIGTERM / інше)

Наприклад, якщо ви готові виграшно вимкнути експрес- додаток. На відміну від сценарію командного рядка, експрес-додаток нескінченно працює, чекаючи нових запитів. 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.

Випадок 3 - Внутрішня помилка

Завжди краще до throwпомилки, ви отримаєте добре відформатоване трасування стека та повідомлення про помилку. Верхній рівень коду завжди може вирішити, чи можуть вони обробити помилку ( catch) чи дозволити їй руйнувати процес. З іншого боку, process.exit(1)процес мовчки припиниться, і шансів на відновлення після цього не буде. Це може бути єдиною «перевагою» process.exit(), ви можете бути впевнені, що процес буде припинено.


4
Дивовижна відповідь. Process.exit()схоже на великий надлишок для більшості програм. Я шукав еквівалент функції php's die () ... більше на кшталт:throw new Error('die msg')
AvadData

Якщо у вас є куповий код, який повинен виконуватись постійно, поки не буде отримано запит на закриття, чи існує приємна угода про реєстрацію подій, яка б дозволила відмовитися від підписки у відповідь на запит на закриття, не вимагаючи, щоб код використовував події або код, який вимагає відключення, має конкретні знання один про одного? На жаль, єдиний спосіб, яким я можу придумати своєрідну реалізацію, полягає в тому, щоб вимагати, щоб будь-який фрагмент коду, який реєструє подію, також створив обгортку, яка включає закриття, щоб скасувати її реєстрацію.
supercat

26

REPL (командний рядок)

  • Натисніть ctrl + c двічі

  • Введіть .exitта натисніть клавішу Enter

Файл сценарію

process.exit(code)

Вузол зазвичай виходить з кодом 0 коли не очікується більше операцій з асинхронізацією.

process.exit(1) слід використовувати для виходу з кодом відмови. Це дозволить нам зробити висновок про те, що вузол не закрився витончено і був змушений закритися.

Існують і інші вихідні коди на кшталт

3 - Внутрішня помилка розбору JavaScript (дуже дуже рідко)

5 - Фатальна помилка в двигуні javascript v8

9 - Неправильний аргумент

Повний список див. У кодах виходу вузлів


12

У мене є програма, яку я хотів:

  1. Надіслати електронному листу користувачеві
  2. Вихід із кодом помилки

Мені довелося підключитися 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); });

4
Думаю, ви хочете process.exitCode
Джуліан де Баль

Для завершення: я провів добрий шматок дня, намагаючись влаштуватися process.exitCodeна роботу в інструмент командного рядка, який я будую (протестований на Node v4.3.0). Але я не міг змусити його поводитись як задокументовано. Це дуже добре могло бути кращим випадком commander- хоча github.com/tj/commander.js/… змушує мене замислитися. Не впевнений, чи бачив хтось інший цю проблему без вузла 4, але документував про всяк випадок для подальшого використання.
mikermcneil

Щодо можливості цього приходу від командира, я також роздивився його єдиний деп ( github.com/zhiyelee/graceful-readlink/… ), але без кісток. Можливо, здається, що можливий винуватець виглядає як: github.com/tj/commander.js/blob/…. Особливо, проблема полягає в тому, що, навіть якщо ви встановите process.exitCode = 1, процес закінчується кодом 0.
mikermcneil

10

Як зазначав @Dominic, кидати невиконану помилку - це краща практика замість виклику process.exit ([код]) :
process.exitCode = 1; throw new Error("my module xx condition failed");


3
Розглянута в контексті питання "Як вийти в Node.js", це жахлива порада. Ваша пропозиція мала б набагато більше сенсу, якби питання конкретно запитувало, як вийти з помилки. Я настійно пропоную висловити свою відповідь таким чином, щоб вказати, що користувач робить так, як ви пропонуєте, лише якщо вони намагаються вийти з програми у разі помилки .
rstackhouse

@rstackhouse, я сподіваюся, що ви пережили помилку, що вказує на -> nodejs.org/api/process.html#process_process_exit_code
MANN

4
Проблема з метанням - це некрасивий, як чорт, стек. Будь-яка порада, щоб уникнути цього сліду стека (не актуально, коли інструмент CLI хоче вийти, якщо використання неправильне)?
MoOx

9

Для виходу

let exitCode = 1;
process.exit(exitCode)

Корисні коди виходу

1 - Catchall для загальних помилок
2 - Неправильне використання вбудованих оболонок (згідно документації Bash)
126 - Команда, яку викликається, не може виконати
127 - "команда не знайдена"
128 - Недійсний аргумент для виходу
128 + n - фатальний сигнал помилки “n”
130 - Сценарій, скасований Control-C
255 \ * - Вихід із поза діапазону

Подумайте про оновлення своєї відповіді, nodejs.org/api/process.html#process_process_exit_code
Cmag

7

З коду ви можете використовувати process.exit([errorcode])де [errorcode]необов’язкове ціле число ( 0за замовчуванням вказує на успіх).

Якщо ви використовуєте цикл друку Read Eval (REPL) , ви можете використовувати Ctrl+ Dабо ввести.exit

Крім того, в Windows або Linux можна використовувати Ctrl+ C, Ctrl+C

У Mac команда Ctrl+ Z, Ctrl+Z


2
Два контрольних c працюють і на mac, принаймні, на моєму з node --version v0.10.18
msouth

Здається, Control-C не скасовує операції, які вже були заплановані, тоді як ctrl-z вбиває процес без зволікань на Mac.
jorisw


3

Мені вдалося змусити всі мої вузлові процеси померти безпосередньо з оболонки Git Bash в Windows 10, набравши taskkill -F -IM node.exe- це закінчує всі процеси вузлів на моєму комп’ютері одразу. Я виявив, що також можу скористатися taskkill //F //IM node.exe. Не впевнений, чому обидва -і //працюють у цьому контексті. Сподіваюся, це допомагає!


Це пов’язано із самою задачею вбивства. Ви самі вбиваєте процеси. Також одного / достатньо.
Пол

2

Оскільки процес є глобальним об'єктом, вам не потрібно імпортувати жоден модуль. Наступна функція закриває або вбиває поточний процес вузла.

process.exit (код)

process.kill (process.pid)

process.abort ()


1

Відкрийте термінал командного рядка, де працює програма вузла, і натисніть Ctrl + C

якщо ви хочете вийти з програми js вузла з коду,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

0

якщо ви хочете вийти з програми njs js, тоді пишіть

process.exit(1)

у вашому коді


3
1 використовується для вказівки помилки в програмі, яку інші уточнення вже уточнюють.
Герик

0

Вихід у вузлі js здійснюється двома способами:

  • Виклик process.exit () явно.
  • Або якщо цикл подій nodejs виконується з усіма завданнями, і нічого не залишається робити. Потім додаток вузла автоматично вийде.

Як це працює?

Якщо ви хочете змусити цикл виконання зупинити процес, yo може використовувати глобальний змінний процес, який є примірником EventEmitter . Тож, коли ви викликаєте process.exit (), ви фактично випромінюєте подію виходу, яка закінчує всі завдання негайно, навіть якщо все ще існують асинхронні операції.

process.exit () приймає в якості параметра вихідний код (Integer). Код 0 за замовчуванням, це означає, що він виходить із «успіхом». У той час як код 1 означає, що він виходить із "провалом".


0

Якщо ви перебуваєте в Windows, перейдіть до диспетчера завдань, потім перейдіть до процесів, шукайте процес під назвою "вузол", потім натискайте на нього правою кнопкою миші та натисніть опцію "Завершити процес".


-1

Ви можете використовувати функцію process.exit ([код]) .

Якщо ви хочете вийти без "відмови", ви використовуєте код 0:

process.exit(0);

Для виходу з кодом "відмови" 1ви можете запустити:

process.exit(1);

Код "відмови" відмови характерний для програми. Тож ви можете використовувати для цього свої власні умовності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.