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

wyz*_*207 1 unix node.js express

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

\n\n

现在我正在使用child_process\xe2\x80\x99sspawn函数并且它正在工作,但是如果节点服务器退出,子脚本也会退出。即使服务器退出,我也需要让子脚本运行完成。

\n\n

我不需要访问 stdout 或子脚本中的任何内容。我只需要一种基本上 \xe2\x80\x9cfire 并忘记 \xe2\x80\x9d 的方法

\n\n

有什么办法可以做到这一点,spawn我可能会失踪吗?或者我应该采取另一种方式来解决这个问题?

\n\n

预先感谢您的任何指导!

\n

Nei*_*unn 7

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

引用文档:

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

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

基本上,这意味着您“启动”的内容将继续运行,直到它实际终止为止。作为“分离”,没有任何东西将子流程与产生它的父流程的执行“联系”起来。

例子:

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();
  }

})();
Run Code Online (Sandbox Code Playgroud)

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();
  }

})();
Run Code Online (Sandbox Code Playgroud)

基本原理是sub.js列表将每 2 秒输出一次,进行 5 次迭代。将以main.js分离的方式“生成”此进程,然后等待 3 秒并自行终止。

尽管实际上并不需要,但出于演示目的,我们正在设置生成的子进程以将其输出( stdout 和 stderr )重定向到out.log同一目录中命名的文件。

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