node.js进程不会因未处理的异常而死亡

时间:2011-11-02 20:06:06

标签: node.js exception-handling cluster-computing

运行以下server.js:

  cluster(app)
    .use(cluster.logger(path_to_logs))
    .use(cluster.stats())
    .use(cluster.pidfiles(path_to_pids))
    .use(cluster.cli())
    .use(cluster.repl(8888))
    .listen(3000);

它按预期工作。但是,让我们抛出一个未处理的异常:

  setTimeout(function () {
      throw new Error('User generated fault.');
   },5000);

使用`$ node server.js运行服务器,它启动并在五秒后抛出异常。因此,服务器退出的方式与按ctrl + c似乎相同。

然而并不完全。因为现在尝试使用$ node server.js重新启动服务器,我收到以下错误:

Express server listening on port 3000

node.js:134
    throw e; // process.nextTick error, or 'error' event on first tick
    ^
Error: EADDRINUSE, Address already in use
...

运行$ ps aux | grep node我可以看到我仍然有两个节点进程正在运行。杀死它们允许我再次启动服务器。但由于它是手动杀死,如果我再次启动服务器,则重新开始相同的过程。 5秒过去,抛出错误,无法重启。

这是一个问题,因为永远会在第一个未处理的异常时导致无限的死亡循环。

所以我的问题是:

  1. 您对此可能发生的原因有任何进一步的想法吗?
  2. 如何通过杀死进程来侦听所有异常并做出反应
  3. 上述方法是不是很糟糕?

  4. 很抱歉在ServerFault上发布此内容,但我意识到这实际上是一个代码问题。

1 个答案:

答案 0 :(得分:1)

关于处理无法处理的例外情况,您可以使用:http://nodejs.org/docs/v0.4.12/api/process.html#event_uncaughtException_

关于抛出错误时不退出的过程:我对群集知之甚少,但我相信“扩展”会创建子进程并对其进行管理,并且在子进程死亡时不会死亡。采取basic look at the source code似乎是在抛出一系列事件,试着看看它投掷的事件并收集更多信息。