Javascript 木偶演员(论赫罗库):如何防止挂铬过程?

Javascript 木偶演员(论赫罗库):如何防止挂铬过程?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我们在一个简单的Node.js应用程序中使用Puppeter创建“作为服务”的屏幕截图。我们在Heroku上运行这个程序,很快我们看到铬进程一直挂起。因此,服务器内存不足,应用程序开始出现故障。以下是最近执行的ps命令的结果: PID STARTED TIME STAT CMD 1 Sun Jan 19 20:02:19 2020 00:00:00 S ps-run 4 Sun Jan 19 20:0

我们在一个简单的Node.js应用程序中使用Puppeter创建“作为服务”的屏幕截图。我们在Heroku上运行这个程序,很快我们看到铬进程一直挂起。因此,服务器内存不足,应用程序开始出现故障。以下是最近执行的
ps
命令的结果:

  PID                    STARTED       TIME   STAT CMD
    1   Sun Jan 19 20:02:19 2020   00:00:00   S    ps-run
    4   Sun Jan 19 20:02:20 2020   00:00:11   Sl   node app.js
  35   Sun Jan 19 20:02:21 2020   00:00:00   Ss   /usr/sbin/sshd -f /app/.ssh/sshd_co
  36   Sun Jan 19 20:02:21 2020   00:00:00   S    bash --login -c node app.js
  73   Sun Jan 19 20:02:22 2020   00:00:24   Sl   /app/.heroku/node/bin/node /app/app
  78   Sun Jan 19 20:02:22 2020   00:00:24   Sl   /app/.heroku/node/bin/node /app/app
  997   Sun Jan 19 20:33:30 2020   00:00:22   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
  999   Sun Jan 19 20:33:30 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
1012   Sun Jan 19 20:33:30 2020   00:02:02   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
1014   Sun Jan 19 20:33:30 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
1021   Sun Jan 19 20:33:30 2020   00:06:44   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
5030   Mon Jan 20 00:29:34 2020   00:00:15   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
5032   Mon Jan 20 00:29:34 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
5045   Mon Jan 20 00:29:34 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
5051   Mon Jan 20 00:29:34 2020   00:01:26   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
5054   Mon Jan 20 00:29:34 2020   00:04:49   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
7088   Mon Jan 20 03:26:01 2020   00:00:10   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
7090   Mon Jan 20 03:26:01 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
7103   Mon Jan 20 03:26:01 2020   00:00:56   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
7105   Mon Jan 20 03:26:01 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
7111   Mon Jan 20 03:26:01 2020   00:03:06   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
10972   Mon Jan 20 07:02:55 2020   00:00:04   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
10974   Mon Jan 20 07:02:55 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
10988   Mon Jan 20 07:02:55 2020   00:00:22   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
10990   Mon Jan 20 07:02:55 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
10996   Mon Jan 20 07:02:55 2020   00:01:13   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
11660   Mon Jan 20 07:23:37 2020   00:00:03   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
11662   Mon Jan 20 07:23:37 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
11677   Mon Jan 20 07:23:38 2020   00:00:19   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
11679   Mon Jan 20 07:23:38 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
11687   Mon Jan 20 07:23:38 2020   00:01:03   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
12132   Mon Jan 20 07:29:31 2020   00:00:03   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
12134   Mon Jan 20 07:29:31 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
12147   Mon Jan 20 07:29:31 2020   00:00:17   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
12148   Mon Jan 20 07:29:31 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
12156   Mon Jan 20 07:29:31 2020   00:00:59   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
12790   Mon Jan 20 07:56:29 2020   00:00:02   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
12792   Mon Jan 20 07:56:29 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
12805   Mon Jan 20 07:56:29 2020   00:00:13   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
12808   Mon Jan 20 07:56:29 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
12814   Mon Jan 20 07:56:29 2020   00:00:44   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
13268   Mon Jan 20 08:02:03 2020   00:00:02   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
13270   Mon Jan 20 08:02:03 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
13282   Mon Jan 20 08:02:03 2020   00:00:12   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
13285   Mon Jan 20 08:02:03 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
13293   Mon Jan 20 08:02:03 2020   00:00:43   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
13862   Mon Jan 20 08:23:30 2020   00:00:00   Ssl  /app/node_modules/puppeteer/.local-chromium/linux-686
13864   Mon Jan 20 08:23:30 2020   00:00:00   S    /app/node_modules/puppeteer/.local-chromium/linux-686
13885   Mon Jan 20 08:23:35 2020   00:00:05   Sl   /app/.heroku/node/bin/node /app/app
13891   Mon Jan 20 08:23:36 2020   00:00:00   Sl   /app/node_modules/puppeteer/.local-chromium/linux-686
15045   Mon Jan 20 08:39:23 2020   00:00:00   S    ssh -o ServerAliveInterval=30 -o Se
17156   Mon Jan 20 09:09:33 2020   00:00:00   Ss   sshd: u55786 [priv]
17158   Mon Jan 20 09:09:33 2020   00:00:00   R    sshd: u55786@pts/0
17159   Mon Jan 20 09:09:34 2020   00:00:00   Ss   -bash
17769   Mon Jan 20 09:20:49 2020   00:00:00   R+   ps -eo pid,lstart,time,stat,cmd
应用程序代码非常简单:

(async () => {
  try {
    const browser = await puppeteer.launch({
      defaultViewport: { width: windowSize.width, height: windowSize.height },
      ignoreHTTPSErrors: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-infobars', '--hide-scrollbars', '--no-default-browser-check', '--bwsi']
    });

    const page = await browser.newPage();
    await page.setDefaultTimeout(20000);
    await page.goto(urlToScreenshot);
    await page.waitForFunction(jsReadyTest, { polling: 500 });
    await page.waitFor(500);
    await page.screenshot({ type: "jpeg", quality: 70 }).then(function (buffer) {
      res.setHeader('Content-Disposition', 'attachment;filename="' + urlToScreenshot + '.jpg"');
      res.setHeader('Content-Type', 'image/jpg');
      res.send(buffer);
    });

    await browser.close();
  } catch (exception) {
    res.send('Runtime exception!');
  }
})();
请注意,我们添加了20秒超时,以确保应用程序(以及浏览器)在Heroku在30秒后终止请求之前结束

如何确保所有铬进程始终正确终止?

您可以使用
--no-zygote
命令参数。据

--不能使用任何合子来完全禁用合子过程的使用。这是在保持分叉的环境中运行无头Chrome所必需的
服务器(如合子)是不必要的和/或不实用的

您可以使用
--no-zygote
命令参数。据

--不能使用任何合子来完全禁用合子过程的使用。这是在保持分叉的环境中运行无头Chrome所必需的
服务器(如合子)是不必要的和/或不实用的


你能试着加上“--没有受精卵”的论点吗?谢谢,hardkoded。到目前为止,这似乎工作得很好…你能尝试添加“--没有受精卵”的论点吗?谢谢,hardkoded。到目前为止,这似乎工作得很好……此外,我将
await browser.close()
移动到
try…catch
finally
部分,如中的代码示例所示。
--no-zytoe
再加上这个似乎可以完美地完成这项工作!此外,我将
wait browser.close()
移动到
try…catch
finally
部分,如中的代码示例所示。
--no-zytoe
再加上这个似乎可以完美地完成这项工作!