Выполнение сценариев bash с использованием child_process в PM2 приводит к перезапуску процесса после завершения сценария

#node.js #child-process #pm2

#node.js #дочерний процесс #pm2

Вопрос:

Я построил доморощенный Netlify. Он отвечает на веб-ссылки с Github и выполняет скрипт bash для развертывания симпатичного React SPA.

Он отлично работает, но при запуске в среде диспетчера процессов PM2 он перезапускается после закрытия / выхода дочернего процесса. Я протестировал много вещей — я даже создал тестовую конечную точку, которая передает ему поддельные данные, поскольку многократное выполнение поддельных развертываний стало утомительным.

Вот некоторый базовый код:

 const childProcess = require('child_process');

async function processDeploy(deploy) {
  console.log(`Processing commit: ${deploy.commit.id}...`);

  childProcess.execFile('./deploy.sh', function (error, stdout, stderr) {
    if (!error) {
      // a function to report the result of the commit
      postDeploy(stdout, stderr, deploy.commit, { state: 'deployed' });
    } else {
      postDeploy('{}', error, deploy.commit, { state: 'error' });
    }
  });
}

  

Существует множество вспомогательных функций, которые отслеживают очередь и так далее, чтобы обслуживать интерфейс базового состояния.

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

Затем процесс перезапускается, поскольку он настроен на перезапуск при kill / die.

Итак, чем PM2 отличается от npm start при запуске моего приложения на основе Express? Что еще более важно, как мне это исправить…

В случае, если это актуально, это мое ecosystem.config.js для PM2:

 module.exports = {
  apps: [
    {
      name: 'App',
      script: 'bin/www',
      exec_mode: 'fork',
      instances: 1,
      autorestart: true,
      watch: false,
      ignore_watch: ['node_modules', '.log'],
      max_memory_restart: '4G',
    },
  ],
};
  

Обновить:

Я пробовал версии узлов 10, 12 и 14. Я переключился с child_process.execFile на child_process.spawn Я исследовал проблемы с памятью и проверил проблемы PM2 с Github.

Теперь я уверен, что PM2 улавливает событие дочернего процесса и путает его с родительским процессом.

Вывод терминала:

 Deploy child process exited with code 0 and signal null // child process event listener for exit
Deploy child process closed with code 0 // child process event listener for close
Processing commit completed.
Queue empty.
Something is trying to kill me.  // parent process event listener for SIGINT