pm2 не перезапускает воркера при возникновении явной ошибки

Я использую pm2 для управления процессом в моем экспресс-приложении nodejs (работающем в режиме кластера).

У нас было 2 вида обработчиков ошибок

  • ПЕРВЫЙ: uncaughtException будет обработан с помощью

    process.on('uncaughtException', function(err){});
    

На самом деле, я не объявляю обработчик, подобный этой причине, позволяющей pm2 обнаруживать умершего рабочего в этом случае, поэтому перезапустите умершего рабочего автоматически.

  • ВТОРОЙ: экспресс-обработчик ошибок, я имею в виду, что ошибка будет перенаправлена ​​на экспресс-обработчик ошибок, а не на обработчик uncaughtException, обработчик ошибок, как показано ниже

    app.use(function(err, req, res, next) {})
    

Я также не объявляю этот обработчик ошибок для той же цели, что и uncaughtException. Но pm2 в этом случае не перезапускает узел.

Есть идеи об этой проблеме? Большое спасибо


person thelonglqd    schedule 11.11.2015    source источник
comment
Действительно ли нужно перезапускать ваше приложение? Если не ошибаюсь, приложение все еще работает и может отвечать на новые запросы. Поскольку исключение было обнаружено, вы должны ответить в экспресс-обработчике ошибок какой-нибудь красивой страницей, сообщив, что возникла проблема, вместо того, чтобы позволить браузеру клиента выйти из тайм-аута.   -  person Molda    schedule 11.11.2015
comment
Да, при обнаружении ошибки экспресс-обработчиками ошибок сервер не выйдет из строя. Но исключение означает, что в вашем коде есть некоторые проблемы, и, возможно, сервер перейдет в нестабильное состояние, и вы не можете знать, что он может отреагировать на запрос в будущем. Я думаю, что в этом случае мы должны перезапустить этот узел.   -  person thelonglqd    schedule 11.11.2015
comment
Затем вы можете попробовать process.exit (0) в обработчике ошибок после регистрации того, что произошло. pm2 должен перезапустить его.   -  person Molda    schedule 11.11.2015
comment
Да, я только что это сделал, и теперь все в порядке.   -  person thelonglqd    schedule 11.11.2015


Ответы (1)


При обнаружении ошибок с помощью экспресс-обработчика ошибок или даже события uncaughtException процесс все еще выполняется, поэтому pm2 не перезапускает его. Если вы хотите, чтобы pm2 перезапускался после каждого исключения, я бы предложил что-то вроде этого:

    process.on('uncaughtException', function(e) {
      console.log('An error has occured. error is: %s and stack trace is: %s', e, e.stack);
      console.log("Process will restart now.");
      process.exit(1);
    })

То же самое и с экспресс-обработчиком ошибок. Когда мы выполняем метод process.exit, процесс завершается, а pm2 перезапускает его.

person gibson    schedule 11.11.2015