You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 21:06:04