puppeteer로 만든 프로그램을 돌리는 중, chromium 브라우저가 종료되지 않는 문제가 발생했다.
다음 명령어로 chromium 창이 몇개 떠 있는지 확인해보자.
pgrep chromium | wc -l
949개?!
엄청난 메모리 손실을 유발하고 있었다.
지금은 겨우 버티고 있을지 몰라도, 언제 서버가 다운될 지 모르는 상황이다.
ps -ef
로 확인을 해보니, 좀비 프로세스로 끝도 없이 남은 모습..
분명히 browser.close()
를 해준 것 같은데 왜 좀비로 남은 걸까?
그 이유는 try catch문으로 감싸서 브라우저를 닫아줄 때, try문에만 browser.close를 적어주었기 때문이다.
이미 브라우저를 켠 상태에서 error가 날 경우 프로그램이 종료되며 해당 브라우저는 좀비 프로세스가 되므로, try catch finally문으로 browser가 항상 닫힐 수 있도록 해주자.
const browser = await puppeteer.launch({
// executablePath: '/usr/bin/chromium-browser',
headless: true,
ignoreHTTPSErrors: true,
ignoreHTTPErrors: true,
args: [
'--disable-gpu', // gpu x
'--disable-font-subpixel-positioning', //disable font subpixel
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage', //dont use shared memory
],
});
try {
const page = await browser.newPage(); // create new page
// action with page
await page.close();
return urls;
} catch (error) {
//error exception
} finally {
await browser.close();
}
만약 그래도 해결이 안된다면,
finally에 다음 문장도 추가해준다.
const pages = await browser.pages();
await Promise.all((await browser.pages()).map((page) => page.close()));
reference
'♾️Language & Framework > 🎈Javascript' 카테고리의 다른 글
[Javascript] - Winston을 사용하여 node.js에서 로깅하는 법 (0) | 2024.01.17 |
---|---|
[JavaScript] - 자바스크립트 유닛 테스트 도구인 Jest 사용법 (1) | 2024.01.09 |