【问题标题】:Quitting node.js gracefully优雅地退出 node.js
【发布时间】:2011-10-20 23:43:06
【问题描述】:

我正在阅读优秀的在线书籍http://nodebeginner.org/ 并尝试简单的代码

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888); 

现在我不知道(我仍然不知道!)如何优雅地关闭 node.js,所以我就去了ctrl+z。现在每次我尝试运行 node server.js 时都会收到以下错误消息。

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use
    at Server._doListen (net.js:1100:5)
    at net.js:1071:14
    at Object.lookup (dns.js:153:45)
    at Server.listen (net.js:1065:20)
    at Object.<anonymous> (/Users/Bob/server.js:7:4)
    at Module._compile (module.js:402:26)
    at Object..js (module.js:408:10)
    at Module.load (module.js:334:31)
    at Function._load (module.js:293:12)
    at Array.<anonymous> (module.js:421:10)

那么,两个问题:

1) 如何优雅地关闭 node.js?

2) 如何修复我造成的混乱?

【问题讨论】:

  • 仅供参考,ctrl+Z 表示“暂停”。暂停进程后,您可以输入fg(正常恢复)或bg(在后台恢复)。
  • 从 bash 输入 fg 在 centOS6 上对我来说非常有用!比接受的答案容易得多:DD +2 先生,如果可以的话
  • 这要容易得多。

标签: node.js


【解决方案1】:

我目前使用 Node 的事件系统来响应信号。以下是我在程序中使用 Ctrl-C (SIGINT) 信号的方法:

process.on( 'SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit( );
})

您收到“正在使用的地址”错误,因为 Ctrl-Z 不会终止程序;它只是暂停了类 Unix 操作系统上的进程,而您放置在后台的节点程序仍然绑定到该端口。

在类 Unix 系统上,[Control+Z] 是最常见的默认键盘 暂停进程的键序列的映射 (SIGTSTP)。[3] 当用户在他们的计算机终端上输入时,当前 正在运行的前台进程被发送一个 SIGTSTP 信号,通常 导致进程暂停执行。用户可以稍后 通过键入命令“fg”(缩写为 前景)或键入“bg”(背景的缩写)等等 键入命令“disown”以将后台进程与 终端。1

您需要通过执行kill &lt;pid&gt; 或“killall -9 node”等来终止您的进程。

【讨论】:

  • killall -9 有点过激;我不会去那里,除非killall -INT 或者只是简单的killall 不起作用。
  • 除了 SIGINT,可能还想监听 SIGTERM 和 SIGHUP ,并且有一个 on uncaughtException 和一个 onexit。信号 9 (SIGKILL) 不能被监听,如果你使用它,它就死了。
  • 如果您希望在正常关闭节点进程之前刷新所有当前请求并且不接受任何新请求,那么示例代码是什么?
  • 使用 'fg' 回到正在运行的进程是完美的。谢谢先生 +1 比杀死更好的选择
【解决方案2】:
  1. 使用Ctrl+C优雅退出节点进程

  2. 清理混乱取决于您的平台,但基本上您需要找到节点正在运行的进程的剩余部分并将其杀死。

    例如,在 Unix 上:ps -ax | grep node 会给你一个类似的条目:

    1039 ttys000    0:00.11 node index.js
    

    其中index.js 是您的节点文件的名称。

    在本例中,1039 是进程 ID(您的会有所不同),因此kill -9 1039 将结束它,您将能够再次绑定到端口。

【讨论】:

  • 请注意,ctrl+c 发出一个 SIGINT,默认情况下会立即停止进程。 kill 发送 SIGTERM 信号,该信号通常用于启动更优雅的关机。 unix signals
  • SIGHUP (1), SIGINT (2), SIGTERM (3) ... SIGKILL (9)。它们的数值与它们的严重性成正比,与“正常关闭”的机会成反比——应用程序愿意。 kill -9 a.k.a. kill -KILL,它将以偏见终止(过程只是在没有警告的情况下结束)。 kill -TERM 会请求一个进程立即退出,kill -INT 会终止像 cat 这样的简单事情,kill -HUP 有时会导致进程重新加载它的配置。 kill -TERMFTW。
  • @BHBH SIGINT 通常也被理解为请求优雅退出。您提到的SIGTERM 链接的资源几乎与它相同。 Many discussions 探索差异。 @Orwellophile 既不SIGINT 也不基于任何其他信号基于进程或它们运行的​​程序的“简单性”进行区分;您可以放心地将您对SIGTERMSIGINT 的描述合二为一,以免混淆读者。
【解决方案3】:

由于 node.js 是一个事件驱动的运行时,最优雅的退出是耗尽待处理事件的队列。当事件队列为空时,该过程将结束。您可以通过执行诸如清除设置的任何间隔计时器以及关闭任何具有打开套接字连接的服务器等操作来确保耗尽事件队列。使用 3rd 方模块时会变得更棘手,因为您将受到模块作者是否注意优雅地排出它创建的未决事件的摆布。这可能不是退出 node.js 进程最实用的方法,因为您将花费大量精力来追踪“泄露”的未决事件,但它最我觉得很优雅。

【讨论】:

  • 这个很有意思,能举个例子吗?
  • 知道如何调试吗?是否可以在控制台上打印剩余的事件?
  • 我有兴趣优雅地完成任何现有请求并阻止任何新请求。但我也对优雅的重新加载感兴趣,所以所有新请求都使用新配置。
【解决方案4】:

键入任一

process.exit()

.exit

优雅地退出node

点击 Control + C 两次将强制退出。

【讨论】:

    【解决方案5】:

    1) 如何优雅地关闭 node.js?

    监听 SIGINT 信号。在 Windows 上,您需要使用 readline 模块监听 ctrl-c。

    我编写了自己的解决方案来为应用程序提供正常关闭和域的使用:grace。值得一看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 2010-12-16
      • 1970-01-01
      • 2020-11-10
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多