만쥬의 개발일기
article thumbnail

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

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!