【问题标题】:Why does cron job causes a memoey leak in Node.js pupeeter schdule?为什么 cron 作业会导致 Node.js puppeteer 调度中的内存泄漏?
【发布时间】:2021-02-04 01:40:14
【问题描述】:

我正在 node.js 上运行一个 puppeteer 项目。

当我像这样手动运行它时: node project.js 它运作良好,没有任何问题。 但是当我像这样使用 crontab 来安排它时:

* 0,8,16 * * * cd ~/project_folder/ && /usr/bin/node project.js >/dev/null 2>&1

服务器内存拥塞到 100%,应用程序崩溃,puppeteer 出现错误page crush

您可以在此图中看到手册与时间表:

服务器错误:

另外,当我运行 ps -ef | grep node 时,我会得到大量的活动服务,太多以至于无法真正指出一个特定的问题。

我该如何解决?

【问题讨论】:

  • 你能告诉我是什么业务或者你为什么需要使用cron作业吗?

标签: node.js unix memory-leaks cron puppeteer


【解决方案1】:

我在使用 puppeteer 时遇到了一些问题,因为我没有在浏览器实例空闲时终止它。如果您完成了对页面的处理,则必须关闭该页面。

await page.close()
await browser.close()

建议: 为此,您可以使用puppeteer-cluster。集群为您处理其余的内存管理和并发问题。

【讨论】:

  • 我确实在应用程序运行结束时使用page.close()browser.close() 甚至process.exit()。此外,如前所述,当我只运行 node project.js 时,这很有效,问题仅在于 cronjob。
  • 你自己用 nodejs 运行 puppeteer 作业?我的意思是你的程序一直在运行?
  • 不,脚本执行后需要3-4小时,然后到最后一行代码时完成。 cron 作业在 root 用户中使用一个简单的 crontab。我也尝试过使用 node-cron - npm,但遇到了类似的问题。
【解决方案2】:

好像cronjob命令出错了。

这个:

* 0,8,16 * * *

从 00:00,08:00,16:00 开始每分钟运行一次命令。曼宁,每分钟一次又一次。

这是正确的,它将在请求的时间(00:00、08:00、16:00)运行一次:

0 0,8,16 * * *

0 而不是*

这是一个检查 cronjob 命令的好网站: Crontab Guru

【讨论】:

    【解决方案3】:

    似乎内存泄漏与 crontab 和 puppeteer 交互有关。

    当我在同一个 ubuntu 18 服务器上运行我的节点/puppeteer 应用程序但使用 pm2 (--restart) 而不是 crontab 时,随着时间的推移没有内存泄漏(但 pm2 有其自身的问题)。

    当我使用 crontab 运行应用程序时,大约 4 天后服务器内存使用率达到 100%(应用程序在白天每 10 分钟运行 5 分钟)。

    0,10,20,30,40,50 7-22 * * * /usr/local/bin/node ~/pptrapp/app.js >> ~/pptrapp/log 2>&1

    此后,每次 crontab 启动应用程序时,日志都会显示“Aborted (core dumped)”。

    我正在使用在每个新的 puppeteer cronjob 之前 1 分钟终止任何挂起进程的解决方法,如下所示:

    # kill all puppeteer and node before next run

    9,19,29,39,49,59 7-22 * * * pkill -f puppeteer

    9,19,29,39,49,59 7-22 * * * killall -9 node

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多