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
相关产品推荐
相关产品推荐

