Ubuntu 26.04와 Playwright 무한 대기 삽질기
안녕하세요. 다들 Playwright 잘 사용하시나요? 저는 종종 크롤링이 필요할 때 아주 유용하게 쓰고 있는데요, 최근 제 WSL을 Ubuntu 26.04로 업데이트하면서 골치 아픈 문제가 생겼었습니다.
이것저것 삽질하며 해결했던 과정을 간단하게 공유하면 다른 분들께도 도움이 될 것 같아 글을 남깁니다.
Ubuntu 26.04 환경에서의 Playwright Chromium 설치 불가
WSL을 신나게 Ubuntu 26.04로 업데이트한 뒤에, 늘 사용하던 크롤링 도구를 돌리려고 스크립트를 실행했습니다. 지워졌던 건지 아니면 캐시 정리를 하다가 날아간 건지 기억은 안 나지만 다시 설치해야 한다고 나오더군요.
그래서 늘 하던 초기 세팅으로 다시 시작했습니다.
poetry run playwright install chromium
늘 잘 사용하던 Chromium으로 설치를 시도했는데 이런 에러가 뜨더군요.
Error: ERROR: Playwright does not support chromium on ubuntu26.04-x64
오잉… 너무 신참 OS라 아직 공식 지원을 안 한다는 건가 했죠. 그래서 열심히 AI와 다툰 끝에 우회하는 방법을 얻었습니다.
export PLAYWRIGHT_HOST_PLATFORM_OVERRIDE="ubuntu24.04-x64"
이렇게 환경 변수를 설정해두면 OS를 강제로 이전 버전(24.04)으로 인식하고 설치가 가능하더군요. 호환성이 완벽한지는 모르겠으나 어쨌거나 설치는 정상적으로 완료됐습니다.
XServer (디스플레이) 실종 사건
이렇게 시스템을 속이고 당당하게 다시 스크립트를 실행했습니다. 하지만 아무리 돌려도 동작을 안 하는 겁니다. 에러조차 뱉지 않고 조용히 무한 대기(Hang) 상태에 빠지더군요.
헤드리스(Headless)로 사용하던 스크립트를 브라우저가 화면에 띄워지게 다시 설정하고 돌렸지만 역시 묵묵부답이었습니다. 그래서 파이썬 껍데기를 벗겨내고 직접 Chromium 바이너리의 내부 로그를 디버깅하면서 확인해 보았습니다.
/home/.../chromium-1194/chrome-linux/chrome --no-sandbox --enable-logging --v=1
[ERROR:ui/ozone/platform/x11/ozone_platform_x11.cc:249] Missing X server or $DISPLAY
웬걸… 디스플레이 설정 문제였던 겁니다.
WSL을 사용하거나 원격 SSH에서 디스플레이(GUI)를 띄워보신 분들은 아시겠지만, 초기에만 설정하고 이후에는 건드리지 않아서 맨날 까먹고 인터넷 뒤져서 다시 세팅하는 게 부지기수죠.
OS를 업데이트하면서 초기화가 됐나 하고 환경 변수를 확인해 보니까 ㅋㅋ
☁ ~ echo $DISPLAY
8.8.8.8:0
8.8.8.8이라니요? 구글 퍼블릭 DNS 서버로 되어있는 겁니다. 원래 이런 건가? 했었는데 과거의 기억을 더듬어 보니 원인이 생각났습니다.
예전에 외부에서 WSL로 통신하려고 네트워크 세팅을 좀 만지다가 .zshrc에 이런 걸 박아뒀던 겁니다.
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
아마 윈도우 호스트 IP를 동적으로 가져오려고 해둔 거였을 텐데, 제가 우분투 네임서버를 구글로 바꾼 순간부터 저 코드가 구글 DNS IP를 낚아채서 디스플레이 목적지로 박아둔 거였죠. 브라우저는 구글 서버가 화면을 받아줄 때까지 허공에 대고 무한정 기다리다 죽었던 겁니다.
Systemd와 WSLg 소켓 증발
아무튼 문제의 코드를 지우고 어찌저찌 다시 세팅해서 Playwright가 정상 동작하는 걸 보았습니다. 혹시나, 진짜 혹시나 해서 WSL을 재가동하고 다시 실행해 보았죠.
근데 아이고, 또 안 켜지는 겁니다. 하…ㅋㅋㅋ
Error: Can't open display: :0
하여간 한 번에 되는 일이 없더라고요.
찾아보니까 WSLg는 윈도우와 리눅스가 화면을 주고받기 위해서 /mnt/wslg/.X11-unix 경로에 통신용 소켓을 만들어 둡니다. 그리고 우분투는 보통 이걸 임시 폴더인 /tmp/.X11-unix에 심볼릭 링크(Symlink)로 연결해서 사용하죠.
처음엔 단순히 /etc/wsl.conf에 부팅 스크립트를 넣어서 다리를 이어주려고 했습니다. 그런데 최신 우분투(26.04)부터 부팅 관리자로 systemd가 도입되면서, 이 녀석이 부팅될 때마다 제가 만든 다리를 부수고 빈 폴더로 싹 다 초기화(덮어쓰기) 해버리는 버그(Race Condition)가 있었던 겁니다.(이건 좀 정확한 내용이 아닐 수 있습니다.)
그래서 다시는 이 systemd-tmpfiles이 소켓을 초기화하지 못하도록, 아예 녀석의 공식 규칙서에 특례 조항을 박아버리기로 했습니다.
최종 해결책
혹시나 저와 비슷한 증상(WSL 최신 버전에서 브라우저 무한 대기, GUI 안 뜸)을 겪고 계신다면 아래 3단계로 완벽하게 해결하실 수 있습니다.
1. .zshrc (또는 .bashrc)
문제의 IP 파싱 쉘 코드를 지우고, 깔끔하게 고정 변수로 교체합니다. OS 우회 변수도 여기에 같이 넣습니다.
# === WSLg 및 Playwright 고정 환경 변수 ===
export DISPLAY=:0
export WAYLAND_DISPLAY=wayland-0
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export PLAYWRIGHT_HOST_PLATFORM_OVERRIDE="ubuntu24.04-x64"
2. Systemd 소켓 연결 공식 예외 처리 (제일 중요!)
부팅될 때마다 /tmp가 날아가도, systemd가 알아서 WSLg 소켓으로 연결하도록 시스템 규칙(tmpfiles.d)을 추가합니다. 터미널에 아래 명령어를 한 줄 그대로 복붙하시면 됩니다.
echo "L+ /tmp/.X11-unix - - - - /mnt/wslg/.X11-unix" | sudo tee /etc/tmpfiles.d/wslg.conf
3. WSL 완전 재부팅
뭐든지 핵심 설정을 건드리고 나면 재부팅을 해야 적용이 되겠죠? Windows PowerShell(명령 프롬프트)을 관리자 권한으로 열고 강제로 껐다 켭니다.
wsl --shutdown
이러면 진짜 끝입니다!
매번 묵직한 Playwright를 열고 디버깅하기에는 많이 번거로우니, 간단하게 xclock 앱을 띄워서 디스플레이가 잘 연결되었는지 테스트해 보시는 것을 강력히 추천합니다.
sudo apt update
sudo apt install x11-apps
xclock
(윈도우 화면에 시계 모양 창이 뜨면 완벽하게 성공한 겁니다 )
이렇게 말이죠.
playwright를 직접 실행하고 싶으시면
/home/{user}/.cache/ms-playwright/chromium-1194/chrome-linux/chrome --no-sandbox --enable-logging --v=1
이렇게 실행해보시면 됩니다. 그러면 크롬창이 아주 잘 띄워질거에요
긴 삽질기 읽어주셔서 감사합니다. 그럼 다들 즐거운 크롤링 되시길
위내용은 AI의 도움을 받아 작성하였습니다. 따라서 틀린 내용이 있을 수 있으니 부정확한 내용이 있다면 지적해주시면 감사하겠습니다.

