用于退出的命令是什么? (即终止Node.js进程)
process.exit()
process.exit([exitcode]) 以指定的代码结束进程。如果省略,则以“成功”代码 0 退出。要以“失败”代码退出: process.exit(1);执行节点的 shell 应该看到退出代码为 1。
注意,使用 process.exit([number])
是 not recommended 练习。
调用 process.exit() 将强制进程尽快退出,即使仍有尚未完全完成的异步操作挂起,包括对 process.stdout 和 process.stderr 的 I/O 操作。在大多数情况下,实际上没有必要显式调用 process.exit()。如果事件循环中没有其他待处理的工作,Node.js 进程将自行退出。可以设置 process.exitCode 属性来告诉进程在进程正常退出时使用哪个退出代码。例如,以下示例说明了 process.exit() 方法的误用,该方法可能导致打印到 stdout 的数据被截断和丢失: // 这是 *not* to do 的示例: if (someConditionNotMet()) { printUsageToStdout(); process.exit(1);这是有问题的原因是因为在 Node.js 中对 process.stdout 的写入有时是异步的,并且可能发生在 Node.js 事件循环的多个滴答声中。然而,调用 process.exit() 会强制进程在执行这些额外的对标准输出的写入之前退出。而不是直接调用 process.exit(),代码应该设置 process.exitCode 并允许进程自然退出,避免为事件循环安排任何额外的工作: // 如何正确设置退出代码,同时让 //进程优雅地退出。 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);
创建一个 exit_0.js 并使用 node exit_0.js && echo 'success'
运行它,它将显示“成功”。如果您使用 process.exit(1);
创建 exit_1.js 并运行 node exit_1.js && echo 'success'
它不会说“成功”,因为您的进程以非零值退出(这表示 shell 的“失败”或“异常退出”)。此外,如果您运行 node exit_1.js
与 node exit_0.js
,您将在 $?
中看到不同的值(您可以通过执行 node exit_1.js
然后执行 echo $?
来检查)。
如果您在 Unix 终端或 Windows 命令行中并且想要退出 Node REPL,则...
按 Ctrl + C 两次,或
键入 .exit 并按 Enter,或
在行首按 Ctrl + D(仅限 Unix)
node
REPL,Ctrl+D 退出是标准行为,因此它也适用于 Windows。
在命令行中,.exit
是您想要的:
$ node
> .exit
$
它记录在 REPL docs 中。 REPL(Read-Eval-Print-Loop)是 Node 命令行的名称。
在普通程序中,使用 process.exit([code])
。
这取决于您愿意退出 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()
强制终止进程是错误的。最好尝试理解 what is holding your script from exiting in expected way。当您解决这个问题时,您可以使用 process.exitCode
将任何结果返回给调用进程。
案例 2 - 因外部信号而终止 (SIGINT/SIGTERM/other)
例如,如果您愿意优雅地关闭 express 应用。与命令行脚本不同,express 应用程序会无限运行,等待新的请求。 process.exit()
在这里不是一个好选择,因为它会中断所有正在处理的请求。其中一些可能是非幂等的(更新、删除)。客户端永远不会知道这些请求是否在服务器端完成,这可能是客户端和服务器之间数据不一致的原因。唯一好的解决方案是用 server.close()
告诉 http 服务器停止接受新请求并等待待处理的请求完成:
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()
的唯一“好处”,您可以确定该进程将被终止。
Process.exit()
对于大多数应用程序来说似乎是个大问题。我正在寻找一个等效于 php 的 die() 函数......更像:throw new Error('die msg')
process.exit()
、process.exitCode
、信号处理和(我想要的)throw new Error
退出。
REPL(命令行)
按 ctrl + c 两次
输入 .exit 并按回车
脚本文件
process.exit(code)
当没有更多异步操作挂起时,节点通常以代码 0 退出。
process.exit(1)
应该用于以失败代码退出。这将允许我们推断该节点没有正常关闭并被强制关闭。
还有其他退出代码,例如
- 内部 JavaScript 解析错误(非常非常罕见)
5 - v8 javascript 引擎中的致命错误
- 无效参数
有关完整列表,请参阅 node exit codes
我有一个我想要的应用程序:
向用户发送一封带有错误代码的电子邮件退出
我必须将 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/… 让我想知道。不确定是否有其他人在 Node 4 上看到过这个问题,但记录下来以备将来参考。
process.exitCode = 1
,进程也会以代码 0 退出。
按 Ctrl + C
两次或 .exit
。
>
(To exit, press ^C again or type .exit)
>
正如@Dominic 指出的那样,throwing an uncaught error 是更好的做法,而不是调用 process.exit([code]):
process.exitCode = 1; throw new Error("my module xx condition failed");
退出
let exitCode = 1;
process.exit(exitCode)
有用的退出代码
1 - Catchall for general errors 2 - Misuse of shell builtins (according to Bash documentation) 126 - Command invoked cannot execute 127 - “command not found” 128 - Invalid argument to exit 128+n - Fatal error signal “n” 130 - Script terminated by Control-C 255\* - Exit status out of range
在代码中,您可以使用 process.exit([errorcode])
,其中 [errorcode]
是一个可选整数(0
是表示成功的默认值)。
如果您使用 Read Eval Print Loop (REPL),您可以使用 Ctrl + D,或输入 .exit
或者,在 Windows 或 Linux 上,您可以使用 Ctrl + C、Ctrl + C
在 Mac 上,命令是 Ctrl + Z、Ctrl + Z
node --version
v0.10.18
添加
process.exit(1);
会为你解决问题的
通过键入 taskkill -F -IM node.exe
,我能够让我的所有节点进程直接从 Windows 10 上的 Git Bash shell 中终止——这会立即结束我计算机上的所有节点进程。我发现我也可以使用 taskkill //F //IM node.exe
。不确定为什么 -
和 //
在这种情况下都有效。希望这可以帮助!
打开运行节点应用程序的命令行终端,然后按 Ctrl + C
如果您想从代码中退出节点 js 应用程序,
process.exit(); // graceful termination
process.exit(1); // non graceful termination
process.exit
从不优雅。省略代码只会使用 process.exitCode ?? 0
。
由于进程是全局对象,您不需要导入任何模块。以下函数退出或终止当前节点进程。
process.exit(code) process.kill(process.pid) process.abort()
如果你想退出 node js 应用程序然后写
process.exit(1)
在你的代码中
node js中的退出有两种方式:
显式调用 process.exit()。
或者,如果 nodejs 事件循环已完成所有任务,并且没有什么可做的。然后,节点应用程序将自动退出。
这个怎么运作?
如果你想强制执行循环停止进程,你可以使用全局变量 process,它是 EventEmitter 的一个实例。因此,当您调用 process.exit() 时,您实际上会发出退出事件,该事件会立即结束所有任务,即使仍有异步操作尚未完成。
process.exit() 将退出代码(整数)作为参数。代码 0 是默认值,这意味着它以“成功”退出。而代码 1 表示它以“失败”退出。
import mongosse from 'mongoose'
import dotenv from 'dotenv'
import colors from 'colors'
import users from './data/users.js'
import products from './data/products.js'
import User from './models/userModel.js'
import Product from './models/productModel.js'
import Order from './models/orderModel.js'
import connectDB from './config/db.js'
dotenv.config()
connectDB()
const importData = async()=>{
try{
await Order.deleteMany()
await Product.deleteMany()
await User.deleteMany()
const createdUsers = await User.insertMany(users)
const adiminUser = createdUsers[0]._id
sampleProducts = products.map(product =>{
return {...product, user:adiminUser }
})
await Product.insertMany(sampleProducts)
console.log('Data Imported!'.green.inverse)
process.exit() //success and exit
}catch(error){
consolele.log(`${error}`.red.inverse)
process.exit(1) //error and exit
}
}
因此,如果我没有收到任何错误,我会在 db 和 try 块中填充一些集合,然后我们使用成功消息退出它,因此我们使用 process.exit() 参数中没有任何内容。如果出现错误,那么我们需要以不成功的消息退出,因此我们在参数中传递 1,例如 process.exit(1)。
额外:这里的退出是指退出典型的node js程序。例如,如果此代码位于名为 dbOperations.js 的文件中,则 process.exit 将退出并且不会运行 process.exit 之后的任何代码
ctrl+C 终止当前进程 ctrl+C 两次退出 REPL shell ctrl+c 退出 REPL SHELL
您可以使用 process.exit([code]) 功能。
如果您想在没有“失败”的情况下退出,请使用代码 0
:
process.exit(0);
要以“失败”代码 1
退出,您可以运行:
process.exit(1);
失败的“失败”代码特定于应用程序。因此,您可以使用自己的约定。
如果您在 Windows 中,请转到任务管理器,然后转到进程,查找名为“节点”的进程,然后用鼠标右键单击它,然后单击“结束进程”选项。
不定期副业成功案例分享
end()
该请求。否则,它只会挂起。exit
一点也不误导。您对 Node 的工作方式感到困惑。将 Node 视为服务器本身。它不只是根据需要启动,就像 PHP 在 Apache 之类的 Web 服务器中一样。 Node 甚至根本不需要与 Web 服务器有任何关系!它只是一些 JavaScript 的宿主,带有一些漂亮的内置库来做有用的事情。mod_php
运行它或使用 Apache。如果你真的想要的话,你可以像 node 一样在 PHP 中重新实现 httpd,或者像在 node 中一样使用更理智/标准化的方法,比如 FastCGI。process.exit()
,如 this answer below 中所述。process.exit(-1)
。为什么?