#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