Процесс node.js не умрет при необработанном исключении - PullRequest
0 голосов
/ 03 ноября 2011

Запуск следующего 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. Вышеуказанный плохой подход?

Извините, что опубликовал это на ServerFault, но я понял, что на самом деле это вопрос кода.

1 Ответ

1 голос
/ 03 ноября 2011

Об обработке необработанных исключений вы можете использовать: http://nodejs.org/docs/v0.4.12/api/process.html#event_uncaughtException_.

О том, что процесс не завершается при возникновении ошибки: я недостаточно знаю о кластере, но я считаю, что "масштабировать"«он создает дочерние процессы, управляет ими и не умирает, когда умирает ребенок.Взглянув на базовый код , исходный код кажется, что он генерирует серию событий, попробуйте посмотреть, какие события он генерирует, и соберите больше информации.

...