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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:06:04