wyz*_*207 1 unix node.js express
我想要做的是,当 Express 应用程序中的端点被命中时,我想在单独的进程中运行命令行脚本 - 无需等待结果。
\n\n现在我正在使用child_process
\xe2\x80\x99sspawn
函数并且它正在工作,但是如果节点服务器退出,子脚本也会退出。即使服务器退出,我也需要让子脚本运行完成。
我不需要访问 stdout 或子脚本中的任何内容。我只需要一种基本上 \xe2\x80\x9cfire 并忘记 \xe2\x80\x9d 的方法
\n\n有什么办法可以做到这一点,spawn
我可能会失踪吗?或者我应该采取另一种方式来解决这个问题?
预先感谢您的任何指导!
\n这里你想要的options.detached
是spawn
. 设置此选项将允许子进程即使在主进程调用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 秒。
归档时间: |
|
查看次数: |
6345 次 |
最近记录: |