Puppeteer正常运行无异常,但nohup模式启动报错或停止运行如何解决?
Puppeteer爬虫EC2后台运行异常修复方案
问题根因
- Puppeteer依赖的Chrome浏览器默认需要GUI显示环境,nohup断开SSH会话后会丢失TTY和DISPLAY环境变量,导致Chrome启动失败、页面实例直接关闭,触发
Session closed协议错误 - nohup的进程守护能力极弱,Node.js默认会在遇到未捕获的Promise Rejection时直接终止进程,且无额外日志输出
- 未配置Puppeteer的Linux服务器适配启动参数,Chrome在无GUI的EC2环境中无法正常初始化
修复步骤
1. 调整Puppeteer启动参数
修改代码中浏览器初始化逻辑,适配无GUI服务器环境:
const browser = await puppeteer.launch({ // 启用新版无头模式,兼容无GUI环境 headless: 'new', args: [ // 禁用沙箱,Linux服务器启动Chrome必填项 '--no-sandbox', '--disable-setuid-sandbox', // 解决EC2小规格实例共享内存不足导致Chrome崩溃的问题 '--disable-dev-shm-usage', // 跳过首次运行引导、默认浏览器检查 '--no-first-run', '--no-default-browser-check' ], // 延长启动超时时间,避免低配置实例启动超时报错 timeout: 60000 })
2. 添加全局异常捕获,避免进程直接退出
在项目入口文件最顶部添加全局异常监听逻辑:
// 捕获未处理的Promise拒绝,防止进程直接终止 process.on('unhandledRejection', (err) => { console.error('运行异常:', err) // 可在此处添加自动重启浏览器、重试任务的逻辑 }) // 处理退出信号,正常关闭浏览器避免残留僵尸进程 process.on('SIGTERM', async () => { if (browser) await browser.close() process.exit(0) })
3. 替换nohup为专业进程守护工具PM2
nohup仅能实现基础的后台挂起,没有异常自动重启、日志管理、开机自启能力,不适合7*24运行的服务:
- 安装PM2:
npm install -g pm2 - 启动爬虫:
pm2 start npm --name "puppeteer-crawler" -- start - 查看实时日志:
pm2 logs puppeteer-crawler - 设置开机自启(EC2重启后爬虫自动拉起):
pm2 save && pm2 startup
如果确实需要继续使用nohup,启动时补充环境变量避免Chrome初始化失败:DISPLAY=:0 nohup npm start &
4. 额外排查项
- EC2实例规格建议不低于t2.small,低配置实例内存不足会导致Chrome被系统OOM机制杀掉,触发会话关闭报错
- 定期清理关闭无效的Page实例,避免内存泄漏引发的进程崩溃
内容的提问来源于stack exchange,提问作者Nati Reitblat
相关产品推荐
相关产品推荐

