在Node.js中如何实现10秒后自动杀死exec创建的子进程
你可以通过保留exec方法返回的子进程实例,超时后调用kill方法终止进程即可,同时需要注意进程正常结束后清除超时定时器,避免无效逻辑执行。
修改后的完整代码如下:
export const javascriptExecuter = (data, input) => { return new Promise((resolve, reject) => { const fileName = "code.js"; let childProcess = null; // 存储超时定时器ID,后续用于清除 const timeoutTimer = setTimeout(() => { if (childProcess) { // 杀死子进程 childProcess.kill('SIGTERM'); // 返回超时错误 resolve({ err: true, output: new Error('代码执行超时,已自动终止'), error: '运行时长超过10秒限制' }) } }, 10000); // 保证文件写入完成后再执行代码 saveFile(fileName, data) .then(() => { return fs.promises.writeFile("jsinput.txt", input) }) .then(() => { // 保存子进程实例 childProcess = exec(`node ${fileName} < jsinput.txt`, (err, stdout, stderr) => { // 进程结束后先清除超时定时器 clearTimeout(timeoutTimer); if (err) { // 超时杀死的错误已经在定时器逻辑处理,避免重复返回 if (err.killed) return return resolve({ err: true, output: err, error: stderr, }); } resolve({ err: false, output: stdout, }); }); }) .catch(() => { clearTimeout(timeoutTimer) reject("internal server error ...") }) }); };
主要改动说明:
- 提前定义变量存储子进程实例和超时定时器ID,超时触发时直接调用子进程的
kill方法终止运行 - 调整了异步逻辑的执行顺序,确保代码文件和输入文件都写入完成后再启动执行进程,避免出现文件未找到、输入内容为空的异常
- 进程正常结束或者报错时都会先清除超时定时器,避免后续触发无效的超时判断逻辑
- 增加了对
err.killed的判断,避免超时已经返回结果后,exec的错误回调重复执行resolve - 修复了原代码中错误分支没有return导致重复触发resolve的问题
内容的提问来源于stack exchange,提问作者Arnav
相关产品推荐
相关产品推荐

