node.js - 关闭 Docker 容器上的 Puppeteer 脚本

标签 node.js docker puppeteer

目前我正在 EC2 实例上的 docker 容器中运行 Puppeteer 脚本(以每小时为间隔)。下面是代码(如果您正在阅读本文,谢谢 Edi Imanto)!

const cron = require('node-cron')
const execute = require('child_process').exec
const puppeteer = require('puppeteer')
const processIDs = []

const createBrowser = async () => {
    const browser = await puppeteer.launch()
    processIDs.push(browser.process().pid)
    return browser
}

const closeBrowser = async (browser) => {
    await browser.close()
    for (let i = 0; i < processIDs.length; i++) {
        execute(`kill -9 ${processIDs[i]}`)
    }
}


const runHourly = async () => {
    const browser = await createBrowser()    
    const await = doSomething()  

    const closeTab = await page.close()
    const exit = await closeBrowser(browser)
}

cron.schedule('* 0/1 * * *', () => {
    await runHourly()
})

当我查看 HTOP 时,有很多“chrome”任务,而且数量每小时都在增加,这意味着它们没有按预期关闭。 enter image description here

console.log-ing 它正在杀死的 proccessIDs[i],我真的找不到与 HTOP 中的 PID 的对应关系,我认为这是因为脚本在容器上运行(?)。我不确定如何正确终止这些任务 - 非常感谢一些帮助/建议。

又一想,难道我没有sudo就没有执行kill吗?

再次感谢!

下面是docker文件

FROM node:10.17.0-slim@sha256:17df3b18bc0f1d3ebccbd91e8ca8e2b06d67cb4dc6ca55e8c09c36c39fd4535d

RUN  apt-get update \
  && apt-get install -y python \  
  && apt-get install -y build-essential \ 
  && apt-get install -y wget --no-install-recommends \
  && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
  && apt-get update \
  && apt-get install -y google-chrome-unstable --no-install-recommends \
  && rm -rf /var/lib/apt/lists/* \
  && wget --quiet https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -O /usr/sbin/wait-for-it.sh \
  && chmod +x /usr/sbin/wait-for-it.sh 

USER root

# Install Puppeteer under /node_modules so it's available system-wide
WORKDIR /usr/src/app 
COPY .  . 
ADD package.json package-lock.json /
RUN npm install

CMD ["node", "transfer.js"]

最佳答案

您需要reap zombie processes .请关注documentation troubleshooting guide for running Puppeteer in Docker .简而言之,您需要使用 --init 选项运行容器,以 PID 0 启动一个简单的进程,该进程将在 Chromium 实例与 Puppeteer 分离后负责收割它们。

关于node.js - 关闭 Docker 容器上的 Puppeteer 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62767901/

相关文章:

javascript - 停止 puppeteer 进程,直到全局 var 值从 false 变为某个字符串

javascript - 如何使用 JSDOM 加载本地 JavaScript 文件?

node.js - NodeJS::截至 2018 年 10 月使用什么或哪个版本

node.js - 带有 Typescript 的 NodeJS 的 REST 客户端

docker - eventstore 容器在启动时存在

docker - 我无法从本地主机获取 shell 到 Pod

javascript - Puppeteer CORS 错误

javascript - Puppeteer 和 Google Chrome headless : influence of CSS @media on rendered PDF

mysql - 我无法将 Node.js 项目与 Mamp 数据库连接

docker - 将Jenkins Security纳入Docker Image中?