Node.js получает SIGINT от pm2 - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь использовать pm2 для запуска моего приложения узла в качестве службы.

Прямо сейчас запуск и остановка приложения работает.Тем не менее, я хочу сделать постепенное завершение работы.

Мое приложение уже прослушивает SIGINT, выключает сервер и затем завершает процесс.Тем не менее, попытка поставить pm2 для отправки SIGINT, просто вызывает перезапуск приложения, как если бы pm2 убивал и запускал его снова.

Вот как я создаю процесс:

pm2 start server.js --name ProcessName --silent --kill-timeout 3000

Вот код моего приложения для прослушивания SIGINT:

process.on("SIGINT", function () {
    //graceful shutdown
    server.end().then(() => {
        process.exit();
    }).catch((err) => {
        console.error(err);
    });

});

Затем, чтобы закрытьприложение, использующее pm2, я запускаю:

pm2 sendSignal SIGINT ProcessName

Что, опять же, перезапускает приложение.

Чтение по документам pm2,Я обнаружил, что pm2 также отправит в приложение событие shutdown, поэтому добавил:

process.on('message', function(msg) {
    if (msg == 'shutdown') {
        server.end().then(() => {
            process.exit();
        }).catch((err) => {
            console.error(err);
        });
    }
});

Что тоже не работает.

Есть идеи, как решить эту проблему?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Если вы еще не решили это ...

Исходя из предоставленной вами информации, я предполагаю, что вы работаете в Windows.

Ваше приложение не может перехватить SIGINT, отправленное PM2 в Windows.
shutdown сообщение работает и в Windows, но оно отправляется только командой gracefulReload.


(обновление)
Это не полные решения, но может быть полезно (надеюсь ...)

sendSignal командные вызовы process.kill() в конечном итоге и некоторые из этих сигналов может работать (не пробовал).

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

pm2 позволяет отправлять пользовательское сообщение ( ссылка ).
Поместите приведенный ниже код в новый файл:

var pm2 = require('pm2');
var id = process.argv[2];

pm2.connect(() => {
  pm2.sendDataToProcessId({
    type: 'shutdown',
    data:{some: 'data'},
    id: id,
    topic: 'some topic'
  }, (err, res) => {
    console.log('message sent');
    pm2.disconnect();

    if(err) throw err;
  })
});

Измените часть, которая прослушивает сообщение shutdown, как показано ниже:

process.on('message', function(msg){
  if(msg == 'shutdown' || msg.type == 'shutdown'){
    // code to clean up
  }
});

И запустите первый файл с node с id кластера, который вы хотите отключить, какаргумент.

Причиной дополнительного msg.type == 'shutdown' в условии является то, что pm2.sendDataToProcessId() требует, чтобы аргумент был объектом с этими ключами, и не принимает простую shutdown строку.

0 голосов
/ 13 ноября 2018

В целом pm2 stop - это правильный способ остановить ваше приложение.Однако если вы запускаете appliation внутри Docker, вам нужно использовать pm2-runtime вместо pm2, который является частью пакета pm2 npm и передает систему SIGINT всем дочерним процессам.Смотри http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs

0 голосов
/ 31 мая 2018

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

Чтобы действительно остановить сервер, используйте pm2 stop вместо pm2 sendSignal SIGINT ProcessName.

См. http://pm2.keymetrics.io/docs/usage/signals-clean-restart/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...