ks.dgoon.lee log

리모트 서버에서 selenium 실행 실패


2024/02/01 23:17:02 #dev #ubuntu #tmux #linux #selenium #headless #python #chrome #chromium #systemd #user runtime directory

리눅스 서버에서 Python+Selenium 으로 주기적으로 돌아가는 작업을 만들어 두었다. 그런데 꽤나 아리송한 문제가 생긴다.

  1. ssh 로 연결해서 실행하면 잘 됨
  2. cron 등록해두고 로그를 보고 있으면... 잘 됨
  3. ssh 연결을 끊고 나가있다가 들어가 로그를 보면, "내가 ssh 로그아웃하고 나서부터 cron 이 실패함"
  4. tmux 세션에서 실행하고 보고 있으면 잘 됨
  5. tmux detach 하고 나서도 잘 됨
  6. ssh 연결 끊고 나서 나가있다 들어가서 tmux attach 해서 보면, "내가 ssh 로그아웃하고 나서부터 실패하기 시작"
  7. nohup 으로도 실행해봤는데 똑같음. 이게 대체 뭔일이야??? 보고 있을때만 된다고??? 불확정성의 원리야???

로그는 대충 아래와 같음.

(Message: session not created: Chrome failed to start: exited normally.
  (chrome not reachable)
  (The process started from chrome location /snap/어쩌고저쩌고/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x55c11185ad93 <unknown>

작업 서버는 

  • Ubuntu 22.04.3 LTS
  • chromium-browser 는 snap 으로 설치
  • python은 anaconda 설치후 만든 venv 에서 python 3.11 .7
  • selenium 은 venv 에서 pip 로 설치

로그를 더 상세하게 찍어보려 했지만 유용한 정보는 없었다. syslog, process list 등을 보며 동작을 상세하게 관찰하면,

  • selenium 초기화 전에 Xvfb, chromedriver 프로세스는 제대로 떠 있었다.
  • 정확하게 driver = webdriver.Chrome(options=chrome_options) 이 코드 실행하다 에러나는 것
  • systemd-cgls 로 프로세스 트리를 보면 내가 로그인해 있는 동안에만 /lib/systemd/systemd --user 프로세스가 존재한다.
  • 내가 로그인하면 syslog 에 이런 로그가 남는다.
Feb  1 14:11:26 myserver systemd[1]: Starting User Manager for UID 1002...
Feb  1 14:11:26 myserver systemd[15411]: Queued start job for default target Main User Target.
Feb  1 14:11:26 myserver systemd[15411]: Created slice User Application Slice.
Feb  1 14:11:26 myserver systemd[15411]: Reached target Paths.
Feb  1 14:11:26 myserver systemd[15411]: Reached target Timers.
Feb  1 14:11:26 myserver systemd[15411]: Starting D-Bus User Message Bus Socket...
Feb  1 14:11:26 myserver systemd[15411]: Listening on GnuPG network certificate management daemon.
Feb  1 14:11:26 myserver systemd[15411]: Listening on GnuPG cryptographic agent and passphrase cache (access for web browsers).
Feb  1 14:11:26 myserver systemd[15411]: Listening on GnuPG cryptographic agent and passphrase cache (restricted).
Feb  1 14:11:26 myserver systemd[15411]: Listening on GnuPG cryptographic agent (ssh-agent emulation).
Feb  1 14:11:26 myserver systemd[15411]: Listening on GnuPG cryptographic agent and passphrase cache.
Feb  1 14:11:26 myserver systemd[15411]: Listening on debconf communication socket.
Feb  1 14:11:26 myserver systemd[15411]: Listening on REST API socket for snapd user session agent.
Feb  1 14:11:26 myserver systemd[15411]: Listening on D-Bus User Message Bus Socket.
Feb  1 14:11:26 myserver systemd[15411]: Reached target Sockets.
Feb  1 14:11:26 myserver systemd[15411]: Reached target Basic System.
Feb  1 14:11:26 myserver systemd[1]: Started User Manager for UID 1002.
Feb  1 14:11:26 myserver systemd[1]: Started Session 39 of User dgoon.
Feb  1 14:11:26 myserver systemd[15411]: Reached target Main User Target.
Feb  1 14:11:26 myserver systemd[15411]: Startup finished in 54ms.
  • 내가 로그아웃하고 10초가 지나면 아래같은 로그가 남는다. 10초 이전에 로그인하면 아래 로그가 남지 않고, 위 로그인 로그도 안남는다.
Feb  1 14:11:02 myserver systemd[1]: session-38.scope: Deactivated successfully.
Feb  1 14:11:12 myserver systemd[1]: Stopping User Manager for UID 1002...
Feb  1 14:11:12 myserver systemd[1558]: Stopped target Main User Target.
Feb  1 14:11:12 myserver systemd[1558]: Stopped target Basic System.
Feb  1 14:11:12 myserver systemd[1558]: Stopped target Paths.
Feb  1 14:11:12 myserver systemd[1558]: Stopped target Sockets.
Feb  1 14:11:12 myserver systemd[1558]: Stopped target Timers.
Feb  1 14:11:12 myserver systemd[1558]: Closed D-Bus User Message Bus Socket.
Feb  1 14:11:12 myserver systemd[1558]: Closed GnuPG network certificate management daemon.
Feb  1 14:11:12 myserver systemd[1558]: Closed GnuPG cryptographic agent and passphrase cache (access for web browsers).
Feb  1 14:11:12 myserver systemd[1558]: Closed GnuPG cryptographic agent and passphrase cache (restricted).
Feb  1 14:11:12 myserver systemd[1558]: Closed GnuPG cryptographic agent (ssh-agent emulation).
Feb  1 14:11:12 myserver systemd[1558]: Closed GnuPG cryptographic agent and passphrase cache.
Feb  1 14:11:12 myserver systemd[1558]: Closed debconf communication socket.
Feb  1 14:11:12 myserver systemd[1558]: Closed REST API socket for snapd user session agent.
Feb  1 14:11:12 myserver systemd[1558]: Removed slice User Application Slice.
Feb  1 14:11:12 myserver systemd[1558]: Reached target Shutdown.
Feb  1 14:11:12 myserver systemd[1558]: Finished Exit the Session.
Feb  1 14:11:12 myserver systemd[1558]: Reached target Exit the Session.
Feb  1 14:11:12 myserver systemd[1]: user@1002.service: Deactivated successfully.
Feb  1 14:11:12 myserver systemd[1]: Stopped User Manager for UID 1002.
Feb  1 14:11:12 myserver systemd[1]: Stopping User Runtime Directory /run/user/[UID]...
Feb  1 14:11:12 myserver systemd[1]: run-user-1002.mount: Deactivated successfully.
Feb  1 14:11:12 myserver systemd[1]: user-runtime-dir@1002.service: Deactivated successfully.
Feb  1 14:11:12 myserver systemd[1]: Stopped User Runtime Directory /run/user/1002.
Feb  1 14:11:12 myserver systemd[1]: Removed slice User Slice of UID 1002.
Feb  1 14:11:12 myserver systemd[1]: user-1002.slice: Consumed 2.495s CPU time.
  • 확인해보니 /run/user/1002 (1002는 내 UID다) 디렉토리는 내가 로그아웃해 있는 동안에는 없어진다.
  • 이미 실행중인 selenium 작업은 실패하지 않는데. 로그아웃한 상태에서 새로 시작을 못하는 것이다.
  • 로그인한 상태에서 /run/user/[UID] 를 확인해보면 여러가지 프로세스들의 정보가 보이는데, 그 중에 *chromium* 정보도 있다!

=> chromium 이 왜 /run/user/[UID] 에 나 실행하고 있어요 정보를 쓸까? 내가 ssh 연결을 끊으면(tmux 세션이 남아있다고 할지라도!!) 사라지는 디렉토리인데. 아무래도 저 디렉토리를 유지시켜주는게 systemd --user 인 것 같다. XDG_RUNTIME_DIR 환경변수가 정체인듯... 


1차시도

=> 혹시 /run/user/[UID] 디렉토리가 없어서 실행을 못하는건가? 디렉토리가 없어지면 자동으로 다시 만들게 해봄 -> 실패

2차시도

=> systemd --user 는 누가 왜 실행하는거지? 관련 문서를 정독하며 여러가지 수동 실행을 해봤지만 -> 실패

3차시도

=> chromium 이 /run/user/[UID] 말고 다른데를 쓰도록 환경변수를 줘 보려 했는데 -> 실패

4차시도

=> ssh 로그인을 하는 동안에는 된다고? tmux 세션에서 ssh localhost 해두면? -> 구리지만 되긴 된다!? 하지만 엔지니어의 영혼이 이건 아니지 않냐며 눈물을 흘리는데...

5차시도

=> tmux를 crontab @reboot 가 아니라 user-level systemd service 로 만들어봄 -> 실패


대체 왜 snap 으로 설치한 chromium 은 내가 ssh 로그인을 하고 있는 동안에만 실행이 되는 것인가.


6차시도

=> 아 진짜 모르겠다. blame installed chromium. Snap으로 설치했던 chromium-browser를 제거하고 google 공식 데비안 패키지 받아서 설치후 시도 -> 잘됨


하... 하......


이 문제는 나보다 훌륭한 분이 깔끔하게 설명해주면 밥을 사드리는 것으로... 내가 지금까지 관측한걸 기반으로는, 그냥 blame package 하고 넘어가야겠다. snap 동작을 잘 모르겠네... 


-----

덧: 구글 크롬 설치하기

  • https://www.google.com/intl/ko_kr/chrome/ 들어가기
  • 제일 밑에 "기타 플랫폼" (영어 페이지에서는 Other platforms) 선택
  • 팝업에서 "Linux" 선택
  • sudo apt install ./google-chrome-stable_current_amd64.deb



댓글 0개