运行以下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秒过去,抛出错误,无法重启。
这是一个问题,因为永远会在第一个未处理的异常时导致无限的死亡循环。
所以我的问题是:
很抱歉在ServerFault上发布此内容,但我意识到这实际上是一个代码问题。
答案 0 :(得分:1)
关于处理无法处理的例外情况,您可以使用:http://nodejs.org/docs/v0.4.12/api/process.html#event_uncaughtException_。
关于抛出错误时不退出的过程:我对群集知之甚少,但我相信“扩展”会创建子进程并对其进行管理,并且在子进程死亡时不会死亡。采取basic look at the source code似乎是在抛出一系列事件,试着看看它投掷的事件并收集更多信息。