PM2 не перезапускает кластеры при ошибках

Когда я использую PM2 для запуска нескольких процессов (т. е. в режиме кластера) и один из этих процессов сталкивается с неперехваченной ошибкой, PM2 не перезапускает этот процесс.
Почему?
Как заставить его перезапускать рабочие процессы в режиме кластера?

Пример кода

// index.js
let counter = 0;
setInterval(function(){
  if(counter >= 5) {
    throw new Error('Worker crash. Why no restart?');
  }
  counter++;
  console.log('Worker alive: ' + Date.now() );
},500);

Выполнить в строке cmd

pm2 start index.js -i 4
pm2 log

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

журналы pm2 (объединены в один файл)

    Worker alive: 1522937847186
Worker alive: 1522937847231
Worker alive: 1522937847276
Worker alive: 1522937847324
Worker alive: 1522937847691
Worker alive: 1522937847736
Worker alive: 1522937847781
Worker alive: 1522937847830
Worker alive: 1522937848193
Worker alive: 1522937848238
Worker alive: 1522937848283
Worker alive: 1522937848332
Worker alive: 1522937848693
Worker alive: 1522937848738
Worker alive: 1522937848783
Worker alive: 1522937848832
Worker alive: 1522937849194
Worker alive: 1522937849238
Worker alive: 1522937849284
Worker alive: 1522937849333
Error: Worker crash. Why no restart?
    at Timeout._onTimeout (/home/usrname/docs/Projects_NodeJS/project/app/index.js:49:11)
    at ontimeout (timers.js:466:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:267:5)
Error: Worker crash. Why no restart?
    at Timeout._onTimeout (/home/usrname/docs/Projects_NodeJS/project/app/index.js:49:11)
    at ontimeout (timers.js:466:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:267:5)
Error: Worker crash. Why no restart?
    at Timeout._onTimeout (/home/usrname/docs/Projects_NodeJS/project/app/index.js:49:11)
    at ontimeout (timers.js:466:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:267:5)
Error: Worker crash. Why no restart?
    at Timeout._onTimeout (/home/usrname/docs/Projects_NodeJS/project/app/index.js:49:11)
    at ontimeout (timers.js:466:11)
    at tryOnTimeout (timers.js:304:5)
    at Timer.listOnTimeout (timers.js:267:5)

person Thiago P    schedule 04.04.2018    source источник
comment
Можете показать логи pm2. Я только что попробовал это, и pm2 перезагружается для меня.   -  person AbhinavD    schedule 05.04.2018
comment
@AbhinavD Я добавил файл журнала, хотя, насколько я вижу, он не содержит никакой полезной информации. Все рабочие падают, а затем все просто останавливается. pm2 по-прежнему показывает рабочих как онлайн.   -  person Thiago P    schedule 05.04.2018
comment
Это странно. Единственная причина, о которой я могу думать, это когда PM2 думает, что процесс узла все еще работает и еще не завершился. Можете ли вы проверить свой код, что вы не ловите исключение? Еще одна вещь, которую вы можете попробовать process.exit(1); в исключении, чтобы убедиться, что процесс умирает. Теперь мы можем проверить, перезапускается ли процесс. Если это так, PM2 поступает правильно. также, каков результат PM2 status   -  person AbhinavD    schedule 05.04.2018
comment
@AbhinavD Я вроде как понял. Я использовал Node версии 9, но когда я перешел на Node версии 8, все заработало. Не знаю почему, но это работает! Кроме того, использование process.exit(1 or even 0) не помогло, и я не поймал исключение. Если бы я запустил программу без PM2, она бы вылетела, как обычно.   -  person Thiago P    schedule 05.04.2018


Ответы (2)


Вы можете попробовать код ниже. Дайте мне знать, если это поможет.

const cluster = require('cluster');
const numOfCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numOfCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log('worker %d died (%s). restarting...',
        worker.process.pid, signal || code);
    cluster.fork();
  });
}
person Ishan Koul    schedule 05.04.2018
comment
Спасибо, но здесь используется кластерный модуль NodeJS, а не pm2. pm2 управляет всем этим за вас. - person Thiago P; 05.04.2018

Переход на Node версии 8 LTS, похоже, решил проблему.

У меня была установлена ​​Node версии 9, и проблема возникла как в Windows, так и в Ubuntu, но когда я перешел на версию 8, все заработало.

person Thiago P    schedule 05.04.2018