用于退出的命令是什么?(即终止Node.js进程)


当前回答

我有一个应用程序,我想:

向用户发送电子邮件退出并返回错误代码

我必须将process.ext(代码)挂接到退出事件处理程序,否则邮件将不会被发送,因为调用process.ext(代码)直接杀死异步事件。

#!/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.ext([number])。

调用process.exit()将强制进程尽快退出即使仍有异步操作等待尚未完全完成,包括I/O操作process.stdout和process.stderr。在大多数情况下,实际上不需要调用process.exit()显式。如果出现以下情况,Node.js进程将自行退出在事件循环中没有附加的工作待定。这个process.exitCode属性可以设置为告诉进程哪个退出当进程正常退出时使用的代码。例如,以下示例说明了process.exit()方法,可能导致打印到stdout的数据截断和丢失://这是一个*不*做什么的例子:if(someConditionNotMet()){打印用途到标准输出();进程.退出(1);}原因是问题是因为在Node.js中写入process.stdout有时是异步的,可能会在Node.js事件循环。然而,调用process.exit()会强制在向stdout进行额外写入之前退出的进程执行。代码应该设置process.exitCode,并通过避免调度事件循环的任何附加工作://如何正确设置退出代码//进程优雅地退出。if(someConditionNotMet()){打印用途到标准输出();process.exitCode=1;}

您可以使用process.ext([code])函数。

如果要退出而不出现“失败”,请使用代码0:

process.exit(0);

要退出并显示“失败”代码1,您可以运行:

process.exit(1);

失败的“失败”代码特定于应用程序。因此,您可以使用自己的约定。

从nodejs.org官方文档中:

process.exit(code)

使用指定的代码结束进程。如果省略,退出将使用“成功”代码0。

要退出并显示“失败”代码:

process.exit(1);

这取决于您愿意退出node.js进程的原因,但无论如何,process.exit()是最后要考虑的选项。引用文档:

需要注意的是,调用process.exit()将强制即使仍有尚未完全完成的未决异步操作,包括process.stdout和process.stderr的I/O操作。在大多数情况下,实际上不需要调用process.exit()显式。Node.js进程将自行退出如果在事件循环中没有附加的待处理工作。这个process.exitCode属性可以设置为告诉进程哪个退出当进程正常退出时使用的代码。

让我们讨论一下您可能愿意退出node.js进程的原因,以及您应该避免process.exit()的原因:

案例1-执行完成(命令行脚本)

若脚本已经结束,而节点解释器并没有退出,则表示某些异步操作仍处于挂起状态。此时使用process.exit()强制进程终止是错误的。最好尝试理解是什么阻碍了脚本以预期的方式退出。当您解决这个问题时,您可以使用process.exitCode将任何结果返回给调用进程。

情况2-因外部信号(SIGINT/SIGTERM/其他)而终止

例如,如果你愿意优雅地关闭快递应用程序。与命令行脚本不同,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-内部错误

抛出错误总是更好的,您将得到格式良好的堆栈跟踪和错误消息。较高级别的代码总是可以决定是否可以处理错误(捕获)或让它使进程崩溃。另一方面,process.ext(1)将无声地终止进程,并没有机会从中恢复。这可能是process.exit()的唯一“好处”,您可以确定该进程将被终止。

如果您在Windows中,请转到任务管理器,然后转到进程,查找名为“节点”的进程,然后用鼠标右键单击它,然后单击“结束进程”选项。