在单独的进程中从Node执行脚本

时间:2018-04-15 02:27:14

标签: node.js express unix

我想要做的是当我的Express应用程序中的端点被命中时,我想在一个单独的进程中运行命令行脚本 - 而不是等待结果。

现在我正在使用child_process的{​​{1}}函数,它正在运行,但如果Node服务器退出,子脚本也会退出。即使服务器退出,我也需要让子脚本运行完成。

我不需要访问stdout或子脚本中的任何内容。我只需要一种基本上“开火并忘记”的方法

有没有办法用spawn来解决这个问题?或者我还有另一种方法可以解决这个问题吗?

提前感谢任何指导!

1 个答案:

答案 0 :(得分:1)

你想要的是options.detachedspawn。设置此选项将允许子进程在主进程调用spawn终止后继续。

引用文档:

  

在Windows上,将options.detached设置为true可使子进程在父进程退出后继续运行。孩子将拥有自己的控制台窗口。为子进程启用后,无法禁用它。

     

在非Windows平台上,如果options.detached设置为true,则子进程将成为新进程组和会话的领导者。请注意,子进程可以在父进程退出后继续运行,无论它们是否已分离。有关更多信息,请参见setsid(2)。

基本上这意味着你发起了什么" 一直运行直到它实际终止。由于'分离',没有什么" tie"执行生成它的父项的子流程。

实施例

sub.js列表

(async function() {

  try {

    await new Promise((resolve,reject) => {
      let i = 0;
      let ival = setInterval(() => {
        i++;
        console.log('Run ',i);
        if (i === 5) {
          clearInterval(ival);
          resolve();
        }
      }, 2000);
    });

  } catch(e) {
    console.error(e);
  } finally {
    process.exit();
  }

})();

main.js列表

const fs = require('fs');
const { spawn } = require('child_process');

(async function() {

  try {

    const out = fs.openSync('./out.log', 'a');
    const err = fs.openSync('./out.log', 'a');

    console.log('spawn sub');

    const sub = spawn(process.argv[0], ['sub.js'], {
      detached: true,               // this removes ties to the parent
      stdio: [ 'ignore', out, err ]
    });

    sub.unref();
    console.log('waiting..');

    await new Promise((resolve,reject) =>
      setTimeout(() => resolve(), 3000)
    );
    console.log('exiting main..');

  } catch(e) {
    console.error();
  } finally {
    process.exit();
  }

})();

基础知识是sub.js列表将每2秒输出5次迭代。 main.js将会产生"产生"这个过程分离,然后等待3秒钟并自行终止。

虽然它并不是真的需要,但出于演示目的,我们正在设置生成的子流程,以将其输出(stdout和stderr)重定向到同一目录中名为out.log的文件。 / p>

你在这里看到的是主列表完成它的工作并产生新的过程然后在3秒后终止。此时子进程只有输出1行,但它将继续运行并产生输出到重定向文件另外7秒,尽管主进程被终止。