我在express / node / ubuntu上运行puppeteer,如下所示:
var puppeteer = require('puppeteer');
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
(async () => {
headless = true;
const browser = await puppeteer.launch({headless: true, args:['--no-sandbox']});
const page = await browser.newPage();
url = req.query.url;
await page.goto(url);
let bodyHTML = await page.evaluate(() => document.body.innerHTML);
res.send(bodyHTML)
await browser.close();
})();
});
Run Code Online (Sandbox Code Playgroud)
多次运行此脚本会留下数百个僵尸:
$ pgrep chrome | wc -l
133
Run Code Online (Sandbox Code Playgroud)
哪个阻塞了srv,
我该如何解决?
kill从Express JS脚本运行可以解决吗?
除了木偶戏和无头镀铬之外,还有没有更好的方法来获得相同的结果?
Ram*_*jan 23
啊!这是一个简单的疏忽。如果发生错误并且您await browser.close()永远不会执行,从而使您陷入僵局怎么办。
使用shell.js似乎是解决这个问题的一种hacky 方式。
更好的做法是使用try..catch..finally. 原因是您希望浏览器关闭,而不管流程是否顺利或抛出错误。与其他代码片段不同的是,您不必尝试在catch块和finally块中关闭浏览器。finally无论是否抛出错误,块总是被执行。
所以,你的代码应该看起来像,
const puppeteer = require('puppeteer');
const express = require('express');
const router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox'],
});
try {
const page = await browser.newPage();
url = req.query.url;
await page.goto(url);
const bodyHTML = await page.evaluate(() => document.body.innerHTML);
res.send(bodyHTML);
} catch (e) {
console.log(e);
} finally {
await browser.close();
}
})();
});
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
com*_*tos 13
根据我的经验,调用 close 后浏览器关闭过程可能需要一些时间。无论如何,您可以检查浏览器进程属性以检查它是否仍未关闭并强制终止它。
if (browser && browser.process() != null) browser.process().kill('SIGINT');
Run Code Online (Sandbox Code Playgroud)
我还在下面发布了我的木偶资源管理器的完整代码。看一眼bw.on('disconnected', async () => {
if (browser && browser.process() != null) browser.process().kill('SIGINT');
Run Code Online (Sandbox Code Playgroud)
我今天自己也遇到了这个问题,并且找到了解决方案。Chromium 未关闭的问题似乎是由于页面未关闭所致。在调用之前关闭所有页面browser.close(),一切都应该没问题:
const pages = await browser.pages();
for (let i = 0; i < pages.length; i++) {
await pages[i].close();
}
await browser.close()
Run Code Online (Sandbox Code Playgroud)
希望这对某人有帮助!
我用https://www.npmjs.com/package/shelljs解决了
var shell = require('shelljs');
shell.exec('pkill chrome')
Run Code Online (Sandbox Code Playgroud)
像这样将代码包装在try-catch中,看看是否有帮助
headless = true;
const browser = await puppeteer.launch({headless: true, args:['--no-sandbox']});
try {
const page = await browser.newPage();
url = req.query.url;
await page.goto(url);
let bodyHTML = await page.evaluate(() => document.body.innerHTML);
res.send(bodyHTML);
await browser.close();
} catch (error) {
console.log(error);
await browser.close();
} finally {
await browser.close();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4450 次 |
| 最近记录: |