Запуск следующего 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, но я понял, что на самом деле это вопрос кода.