Node.jsで終了する方法


回答:


2376

グローバルprocessオブジェクトのexitメソッドを呼び出します。

process.exit()

ドキュメントから:

process.exit([コード])

指定されたでプロセスを終了しますcode。省略した場合、exitは「成功」コードを使用します0

「失敗」コードで終了するには:

process.exit(1);

ノードを実行したシェルは、終了コードをと表示するはず1です。


5
何かを追加したいだけです。リクエストを処理する場合は、リクエストも処理する必要がありend()ます。それ以外の場合は、ハングアップします。
pixelfreak 2012

126
@pixelfreak、exitまったく誤解を招くものではありません。Nodeの動作について混乱しています。ノードをサーバー自体と考えてください。PHPはApacheのようなWebサーバー内にあるので、必要に応じて起動されるだけではありません。ノードは、Webサーバーとはまったく関係がありません!これはJavaScriptのホストにすぎず、便利なことを行うための気の利いた組み込みライブラリがいくつかあります。
ブラッド

6
@BradそしてPHPは汎用言語です。mod_phpApacheで実行したり、Apacheを使用したりする必要はありません。nodeのようにFastCGIのようなより健全で標準化されたアプローチが本当に必要な場合は、nodeと同様にPHPでhttpdを再実装できます。
binki 2016

38
注意してくださいprocess.exit()されてお勧めできませんで説明したように、以下のこの答えを
AndreasPizsa 2017

410

ただ、ノート使用していることがprocess.exit([number])あるお勧めできません練習。

呼び出しは、process.exit()I / O操作を含むことは、まだ完全には完了していない保留中の非同期操作にはまだ存在していてもすぐに可能な限り終了までのプロセスを強制します process.stdoutprocess.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)を呼び出すと、すべての子プロセスが完了する前にメインスクリプトが終了します!)
Nick

15
私はこの答えを使用しましたが、私のプロセスが実際に終了することはありませんでした。それをctrl-Cする必要がありました。
jcollum 2017年

34
即時処理および保留中のイベント終了の多くの使用例があります。それがまさにprocess.exit()意図されていることです。
ドミニクセリザーノ2018年

7
それは質問に答えないので、これはどんなストレッチによっても最良の答えではありません。代わりに、nodejsプログラムのコードフローを開発する方法のベストプラクティスを提供します。
anon58192932

365

nodejs.orgの公式ドキュメントから:

process.exit(code)

指定されたコードでプロセスを終了します。省略した場合、exitは「成功」コード0を使用します。

「失敗」コードで終了するには:

process.exit(1);

9
@アリソンはい、正確にはcode = 0; process.exit(code);
wprl 2013

7
もしあなたが存在しているなら、あなたはおそらくその価値を気にしないでしょうcodeか?
Armand

8
@Alisonより良いアイデアはprocess.exit()、コードがデフォルトで0に設定されているため、パラメータなしの場合です
Jeremy Moritz

2
@Armand正解-コードは単なる変数であり、この場合、パラメーターが何かを示すために使用されます。したがって、.exit(0)は例のすべてを実行します。
Gerard ONeill、2014年

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.jsnode exit_0.js(あなたが実行して確認することができnode exit_1.js、その後、やってecho $?)。
msouth 2014

277

UnixターミナルまたはWindowsコマンドラインを使用していて、ノードREPLを終了する場合は、次のいずれかを実行します。

  • Ctrl+をC2回押す、または
  • 入力.exitし、Enterキーを押します、または
  • 行頭でCtrl+ Dを押す(UNIXのみ)

14
Nodeを超えて、MacまたはLinuxのCtrl + Dショートカットは、BashなどのUnixシェル、MySQLやPostgreSQLなどのデータベースのシェル、およびプログラミング言語のREPLなど、これまでに遭遇するほとんどすべてのシェルおよびREPLで機能することに注意してください。 Python、PHP、Ruby。これは、私が使用するシェルを終了する唯一の方法です。
Mark Amery

2
nodeREPLは、Ctrl + D出口までの標準的な動作であるので、それはまた、Windows上で動作します。
アラン

Ctrlキーを押しながらC(でも、Macの!)
プリンス

124

コマンドラインから、.exitあなたが欲しいものです:

$ node
> .exit
$

REPL docsに記載されています。REPL(Read-Eval-Print-Loop)は、Nodeコマンドラインが呼び出されるものです。

通常のプログラムから、を使用しますprocess.exit([code])


79

それはあなたが終了Node.jsのプロセスに喜んでいる理由に依存するが、いずれにしてもprocess.exit()ある考慮すべき最後のオプション。ドキュメントからの引用:

呼び出しがあることに注意することが重要であるprocess.exit()I / O操作を含むことは、まだ完全には完了していない保留中の非同期操作にはまだ存在していてもすぐに可能な限り終了までのプロセスを強制しますprocess.stdoutprocess.stderr

ほとんどの場合、実際にprocess.exit()明示的に呼び出す必要はありません 。イベントループで保留中の追加の作業がない場合、Node.jsプロセスは独自に終了します。 process.exitCodeプロパティは、終了コードが正常プロセスの終了時に使用するためのプロセスを伝えるために設定することができます。

node.jsプロセスを終了しても構わないと考えられる理由と、回避すべき理由について説明しますprocess.exit()

ケース1-実行完了(コマンドラインスクリプト)

スクリプトが最後に到達し、ノードインタープリターが終了しない場合は、一部の非同期操作がまだ保留中であることを示しています。process.exit()この時点ででプロセスを強制終了するのは誤りです。スクリプトが予期した方法で終了しない原因を理解することをお勧めします。そして、これを解決すると、process.exitCode呼び出しプロセスに結果を返すために使用できます。

ケース2-外部信号による終了(SIGINT / SIGTERM /その他)

たとえば、Expressアプリを適切にシャットダウンする場合などです。コマンドラインスクリプトとは異なり、Expressアプリは無限に実行され続け、新しいリクエストを待ちます。process.exit()パイプラインにあるすべてのリクエストを中断するため、ここでは不適切なオプションになります。そして、それらの一部は、べき等ではない可能性があります(UPDATE、DELETE)。クライアントは、これらの要求がサーバー側で完了したかどうかを知ることはなく、それがクライアントとサーバー間のデータの不整合の原因である可能性があります。唯一の適切な解決策は、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のdie()関数に相当するものを探していました...詳細:throw new Error('die msg')
AvadData

シャットダウン要求が受信されるまで継続的に実行されるはずのコードの束がある場合、イベントを使用するコードを必要とせずに、シャットダウン要求に応答してサブスクリプションを破棄できるようにするイベントを登録するための素晴らしい規則がありますか?または、シャットダウンを要求するコードは、互いについて特定の知識を持っていますか?残念なことに、イベントを登録するコードの一部がイベントを登録解除するためのクロージャーを含むラッパーも作成することを要求するのが、ちょっとした実装に私が考えることができる唯一の方法です。
スーパーキャット2018年

26

REPL(コマンドライン)

  • 2回押すctrl + c

  • 入力.exitしてEnter キーを押します

スクリプトファイル

process.exit(code)

ノードは通常、保留中の非同期操作がなくなるとコード0で終了します

process.exit(1) 失敗コードで終了するために使用する必要があります。これにより、ノードが正常に閉じられず、強制的に閉じられたと推測できます。

のような他の終了コードがあります

3-内部JavaScript解析エラー(非常にまれ)

5-v8 JavaScriptエンジンの致命的なエラー

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
ジュリアン・デ・Bhal

記録のために:私は、process.exitCode私が構築しているコマンドラインツール(Node v4.3.0でテスト済み)で動作するように、その日のかなりの部分を費やしました。しかし、私はそれをドキュメントどおりに動作させることができませんでした。これはcommandergithub.com / tj / commander.js /…の場合は非常に問題でした。他の誰かがこの問題をノード4で見たことがあるかどうかはわかりませんが、将来の参考のために文書化しておいてください。
mikermcneil 2016

これが指揮官から来る可能性について、私はその唯一の要点github.com/zhiyelee/graceful-readlink/…)も調べましたが、サイコロはありませんでした。唯一可能な犯人は、おそらくのように思える:github.com/tj/commander.js/blob/... 問題は、つまり、具体的にあなたが設定されていてもprocess.exitCode = 1、コード0でプロセスが終了
mikermcneil

11

@Dominicが指摘したように、キャッチされていないエラーをスローすることは、process.exit([code])を呼び出すよりも良い方法です。
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

5
スローの問題は、地獄のスタックトレースとして醜いものです。このスタックトレースを回避するためのヒント(使用方法が正しくない場合にCLIツールが終了する場合は関係ありません)?
MoOx 2016

9

出る

let exitCode = 1;
process.exit(exitCode)

便利な終了コード

1-一般的なエラーのキャッチオール
2-シェル組み込みの誤用(Bashのドキュメントによる)
126-呼び出されたコマンドは実行できません
127-「コマンドが見つかりません」
128-終了する引数が無効です
128 + n-致命的なエラー信号「n」
130-Control-Cによってスクリプトが終了しました
255 \ *-終了ステータスが範囲外です

答えを更新することを検討してください。nodejs.org
api / process.html#

7

コードからprocess.exit([errorcode])、where [errorcode]はオプションの整数を使用できます(0成功を示すデフォルトです)。

あなたが使用している場合は読む評価がループ(REPL)を印刷し、あなたが使用することができますCtrl+ D、またはタイプ.exit

または、WindowsまたはLinuxではCtrl+ CCtrl+C

Macでは、コマンドはCtrl+ ZCtrl+Z


2
あまりにも、少なくとも鉱山のMAC上の2つの制御Cの作品、 node --version v0.10.18
msouth

Control-Cはすでにスケジュールされた操作をキャンセルするようには見えませんが、Macではctrl-zはプロセスを遅滞なく終了します。
jorisw

7

Ctrl + Cまたはを2回押し.exitます。

> 
(To exit, press ^C again or type .exit)
> 

3

入力することで、Windows 10のGit Bashシェルからすべてのノードプロセスを直接taskkill -F -IM node.exe終了させることができました。これにより、コンピューター上のすべてのノードプロセスが一度に終了します。も使用できることがわかりましたtaskkill //F //IM node.exe。なぜ両方わからない-//、この文脈での作業。お役に立てれば!


これはtaskkill自体が原因です。あなた自身がプロセスを殺しています。また、単一の/で十分です。
Paul Stelian

2

プロセスはグローバルオブジェクトであるため、モジュールをインポートする必要はありません。次の関数は、現在のノードプロセスを終了または強制終了します。

process.exit(code)

process.kill(process.pid)

process.abort()


1

ノードアプリケーションが実行されているコマンドラインターミナルを開き、Ctrl + Cキーを押します。

ノードjsアプリケーションをコードから終了する場合は、

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

0

ノードjsアプリケーションを終了したい場合は、

process.exit(1)

あなたのコードで


3
1は、アプリケーションにエラーがあったことを示すために使用されます。これは、他の回答ですでに明らかにされています。
ヘリック

0

ノードjsの終了は、次の2つの方法で行われます。

  • 明示的にprocess.exit()を呼び出します
  • または、nodejsイベントループがすべてのタスクで実行され、何もする必要がない場合。その後、ノードアプリケーションは自動的に終了します。

使い方?

実行ループにプロセスを強制的に停止させたい場合は、EventEmitterのインスタンスであるグローバル変数プロセスを使用できます。そのため、process.exit()を呼び出すと、実際には、実行されていない非同期操作がある場合でも、すべてのタスクを即座に終了するexitイベントが発行されます。

process.exit()は、終了コード(整数)をパラメーターとして取ります。コード0がデフォルトであり、これは「成功」で終了することを意味します。コード1は「失敗」して終了することを意味します。


0

Windowsを使用している場合は、タスクマネージャーに移動し、[プロセス]に移動して、「ノード」というプロセスを探し、マウスの右ボタンでクリックして、[プロセスの終了]オプションをクリックします。


-1

process.exit([code])関数を使用できます。

「失敗」せずに終了する場合は、コードを使用します0

process.exit(0);

「失敗」コードで終了するには、次のコマンドを1実行します。

process.exit(1);

失敗の「失敗」コードはアプリケーションに固有です。したがって、独自の規則を使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.