Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在单独的进程中从节点执行脚本_Node.js_Express_Unix - Fatal编程技术网

Node.js 在单独的进程中从节点执行脚本

Node.js 在单独的进程中从节点执行脚本,node.js,express,unix,Node.js,Express,Unix,我想做的是,当我的Express应用程序中的一个端点被命中时,我想在一个单独的进程中运行一个命令行脚本,而不必等待结果 现在我正在使用child\u进程的spawn功能,它正在工作,但是如果节点服务器退出,子脚本也会退出。我需要让子脚本运行到完成,即使服务器退出 我不需要访问子脚本中的标准输出或任何内容。我只需要一种基本上“开火然后忘记”的方法 是否有任何方法可以使用我可能缺少的spawn执行此操作?或者我还有别的办法吗 提前感谢您的指导 你在这里想要的是什么。设置此选项将允许子进程在调用spa

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

现在我正在使用
child\u进程
spawn
功能,它正在工作,但是如果节点服务器退出,子脚本也会退出。我需要让子脚本运行到完成,即使服务器退出

我不需要访问子脚本中的标准输出或任何内容。我只需要一种基本上“开火然后忘记”的方法

是否有任何方法可以使用我可能缺少的
spawn
执行此操作?或者我还有别的办法吗

提前感谢您的指导

你在这里想要的是什么。设置此选项将允许子进程在调用
spawn
的主进程终止后继续

引用文件:

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

在非Windows平台上,如果options.detached设置为true,则子进程将成为新进程组和会话的负责人。请注意,在父进程退出后,子进程可能会继续运行,无论它们是否分离。有关更多信息,请参阅设置ID(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();
  }

})();
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
列表将在5次迭代中每2秒输出一次。
main.js
将以分离状态“生成”此进程,然后等待3秒钟并自行终止

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

您在这里看到的是,主列表执行它的任务,生成新进程,然后在3秒钟后终止。此时,子进程将只有一行输出,但它将继续运行,并在7秒钟内生成重定向文件的输出,尽管主进程已终止。

这里您想要的是一行输出。设置此选项将允许子进程在调用
spawn
的主进程终止后继续

引用文件:

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

在非Windows平台上,如果options.detached设置为true,则子进程将成为新进程组和会话的负责人。请注意,在父进程退出后,子进程可能会继续运行,无论它们是否分离。有关更多信息,请参阅设置ID(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();
  }

})();
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
列表将在5次迭代中每2秒输出一次。
main.js
将以分离状态“生成”此进程,然后等待3秒钟并自行终止

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


您在这里看到的是,主列表执行它的任务,生成新进程,然后在3秒钟后终止。此时,子进程将只有一行输出,但它将继续运行并在7秒钟内生成重定向文件的输出,尽管主进程被终止。

我相信这是正确的。对于测试用例,我没有很快的时间,但是文档似乎指向了这个方向。我相信这是正确的。对于测试用例,我们没有太多的时间,但是文档似乎是这样的。非常感谢!我知道我一定错过了什么明显的东西!谢谢!我知道我一定错过了什么明显的东西!