正好退出node.js

Ran*_*lue 74 node.js

我正在阅读优秀的在线书籍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); 
Run Code Online (Sandbox Code Playgroud)

现在我不知道(我仍然不知道!)如何优雅地关闭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)
Run Code Online (Sandbox Code Playgroud)

那么,有两个问题:

1)如何正常关闭node.js?

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

Ehe*_*Tov 126

我目前使用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( );
})
Run Code Online (Sandbox Code Playgroud)

您收到了"正在使用的地址"错误,因为Ctrl-Z不会终止程序; 它只是在类似unix的操作系统上挂起进程,你放在后台的节点程序仍然绑定到该端口.

在类Unix系统上,[Control + Z]是挂起进程的密钥序列(SIGTSTP)最常见的默认键盘映射.[3] 当用户在其计算机终端输入时,向当前运行的前台进程发送SIGTSTP信号,这通常导致进程暂停其执行.用户可以稍后通过键入命令'fg'(前景的缩写)或键入'bg'(背景的缩写)并再键入命令'disown'以将后台进程与终端分开来继续执行流程.1

您需要通过执行kill <pid>或"killall -9节点"等来终止您的进程.

  • 这正是我所寻找的,谢谢先生.+1 (10认同)
  • `killall -9`有点激烈; 除非`killall -INT`或只是普通的`killall`不起作用,否则我不会去那里. (3认同)
  • 除了SIGINT之外,还可能想要监听SIGTERM和SIGHUP,并且有一个on uncaughtException和onexit.信号9(SIGKILL)无法收听,如果你使用它,它就死了. (3认同)

小智 52

  1. 使用Ctrl+ C可以正常退出节点进程

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

    例如,在Unix上:ps -ax | grep node将为您提供如下条目:

    1039 ttys000    0:00.11 node index.js
    
    Run Code Online (Sandbox Code Playgroud)

    index.js您的节点文件的名称在哪里.

    在这个例子中,1039是进程id(你的将是不同的),所以kill -9 1039将结束它,你将能够再次绑定到端口.

  • `SIGHUP(1)`,`SIGINT(2`),`SIGTERM(3)```SIGKILL(9)`.它们的数值与它们的严重程度成正比,与"正常关闭"的机会成反比 - 应用程序愿意.`kill -9`又名`kill -KILL`,它将以偏见终止(进程只是在没有警告的情况下结束).`kill -TERM`会请求进程立即退出,`kill -INT`将终止简单的事情,比如**cat**,`kill -HUP`有时会导致进程重新加载它的配置.`kill -TERM` FTW. (4认同)
  • 请注意ctrl + c发出SIGINT,默认情况下会立即停止进程.`kill`发送SIGTERM信号,该信号通常用于启动更优雅的关闭.[unix signals](http://en.wikipedia.org/wiki/Unix_signals) (2认同)

jki*_*ens 22

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


Vie*_*van 7

输入任一个

process.exit()
Run Code Online (Sandbox Code Playgroud)

要么

.exit
Run Code Online (Sandbox Code Playgroud)

node优雅地退出

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