Node.js 在单独的进程中从节点执行脚本
我想做的是,当我的Express应用程序中的一个端点被命中时,我想在一个单独的进程中运行一个命令行脚本,而不必等待结果 现在我正在使用Node.js 在单独的进程中从节点执行脚本,node.js,express,unix,Node.js,Express,Unix,我想做的是,当我的Express应用程序中的一个端点被命中时,我想在一个单独的进程中运行一个命令行脚本,而不必等待结果 现在我正在使用child\u进程的spawn功能,它正在工作,但是如果节点服务器退出,子脚本也会退出。我需要让子脚本运行到完成,即使服务器退出 我不需要访问子脚本中的标准输出或任何内容。我只需要一种基本上“开火然后忘记”的方法 是否有任何方法可以使用我可能缺少的spawn执行此操作?或者我还有别的办法吗 提前感谢您的指导 你在这里想要的是什么。设置此选项将允许子进程在调用spa
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秒钟内生成重定向文件的输出,尽管主进程被终止。我相信这是正确的。对于测试用例,我没有很快的时间,但是文档似乎指向了这个方向。我相信这是正确的。对于测试用例,我们没有太多的时间,但是文档似乎是这样的。非常感谢!我知道我一定错过了什么明显的东西!谢谢!我知道我一定错过了什么明显的东西!