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

Node.js使用puppeteer和sharp完成截图裁剪后程序不退出如何解决

问题根因

你的程序执行完不退出,核心有两个原因:

  • sharp 内部默认会维护一个常驻的工作线程池用于图像处理,任务执行完成后不会主动销毁,会一直持有进程句柄
  • 你的异步逻辑没有完整闭环,无法在所有任务执行结束后主动触发进程退出

修复代码

你可以直接修改代码如下:

const log = require('why-is-node-running')
const net = require('net')
const puppeteer = require('puppeteer');
const sharp = require("sharp");

async function tkscr() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setViewport({
    width: 1920,
    height: 1080
  })
  await page.goto('https://www.google.com/', {waitUntil: 'load', timeout: 0});
  await page.screenshot({ path: 'gg.jpeg' ,fullPage: true});
  await browser.close();
}

async function cropImage() {
  try {
    await sharp("gg.jpeg")
      .extract({ width: 770, height: 388, left: 552, top: 770  })
      .toFile("sammy.jpeg")
    console.log("process completed");
    // 主动销毁sharp的工作线程池,释放句柄
    sharp.terminate()
    // 如果你需要确认剩余活跃句柄可以保留下面的日志,不需要可以直接删掉
    setTimeout(function () {
      log()
      // 所有任务完成后主动退出进程,也可以依赖资源释放后自动退出
      process.exit(0)
    }, 100)
  } catch (error) {
    console.log(error);
    sharp.terminate()
    process.exit(1)
  }
}

// 完整链式调用异步逻辑
tkscr()
  .then(cropImage)
  .catch(err => {
    console.log(err)
    process.exit(1)
  });

关键修改说明

  • 把回调形式的cropImage改成async/await写法,确保图像处理完成后才执行后续释放逻辑
  • 图像处理完成后主动调用sharp.terminate()销毁sharp的常驻线程池,这是解决进程不退出的核心修改
  • 补全异步异常捕获逻辑,出现错误时也能正常释放资源退出进程

内容的提问来源于stack exchange,提问作者Rahul B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:36:03