微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在PM2下使用child_process执行bash脚本会导致该进程在脚本完成后重新启动

如何解决在PM2下使用child_process执行bash脚本会导致该进程在脚本完成后重新启动

我建立了自己的Netlify。它回答了来自Github的webhook,并执行了一个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,{ state: 'error' });
    }
  });
}

有很多支持功能,可以跟踪队列等,以便为基本状态前端服务。

我花了很长时间通过Node和PM2日志来查找...什么都没有。而且我认为部分原因是由于我怀疑实际上没有错误- PM2执行脚本,脚本在完成后退出,而PM2决定是时候终止该进程了。

然后该进程重新启动,因为它设置为在kill / die上重新启动。

因此,在运行基于Express的应用程序时,PM2与npm start有何不同?更重要的是,我该如何解决它...

在相关的情况下,这是我对PM2的ecosystem.config.js

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',},],};

更新:

我尝试了Node版本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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。