我想要做的是当我的Express应用程序中的端点被命中时,我想在一个单独的进程中运行命令行脚本 - 而不是等待结果。
现在我正在使用child_process
的{{1}}函数,它正在运行,但如果Node服务器退出,子脚本也会退出。即使服务器退出,我也需要让子脚本运行完成。
我不需要访问stdout或子脚本中的任何内容。我只需要一种基本上“开火并忘记”的方法
有没有办法用spawn
来解决这个问题?或者我还有另一种方法可以解决这个问题吗?
提前感谢任何指导!
答案 0 :(得分:1)
你想要的是options.detached
的spawn
。设置此选项将允许子进程在主进程调用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秒,尽管主进程被终止。