카테고리 보관물: 미분류

WSL2를 항상 켜두는 방법: 백그라운드 유지 문제 해결하기

문제 상황

WSL2(Windows Subsystem for Linux 2)를 PC나 Mini PC에서 리눅스 서버처럼 계속 실행해두고 싶었습니다. 하지만 시간이 지나면 자동으로 종료되어 서버로 사용할 수 없는 문제가 발생했습니다.

여러가지를 해봤지만 모두 실패했는데 성공한 방법을 공유합니다.

시도했던 해결책들

1. 백그라운드 프로세스 실행

WSL2는 기본적으로 백그라운드에서 실행 중인 프로세스가 없으면 자동으로 종료될 수 있습니다. 백그라운드 프로세스를 실행해 놓았지만 효과가 없었습니다.

2. 시스템 절전 모드 비활성화

Windows 시스템이 절전 모드나 하이버네이트로 전환되면 WSL2가 중단될 수 있습니다. 절전 모드를 사용하지 않도록 설정해 보았지만 역시 해결되지 않았습니다.

3. WSL 설정 문제 확인

특정 서비스(예: Redis) 실행 시 WSL이 중단되는 경우가 있다고 하여 확인했지만, 이런 문제는 없었습니다.

4. 리소스 과부하 체크

WSL2가 과도한 메모리나 CPU를 사용할 경우, Windows가 이를 강제로 종료할 수 있습니다. 예를 들어, vmmem 프로세스가 높은 리소스를 소모하는 경우가 있는데, 이런 경우 자동 종료될 수 있습니다. 하지만 이 문제도 아니었습니다.

5. 기본 쉘 설정 확인

기본 쉘 설정이 잘못되어 실행되지 않거나 종료되는 경우도 있습니다. 예를 들어, 삭제된 쉘(zsh 등)을 기본으로 설정한 경우 문제가 발생할 수 있지만, 이 문제도 아니었습니다.

해결 방법

여러 방법을 시도한 끝에 다음 명령어를 실행하면 WSL2가 백그라운드에서 계속 실행되는 것을 확인했습니다:

wsl --exec dbus-launch true

이 명령어는 WSL 프로세스를 활성 상태로 유지해줍니다. D-Bus 세션을 시작하고 이를 통해 WSL의 백그라운드 프로세스가 계속 실행되도록 합니다. 이렇게 해도 2주 정도 지나면 종료될 수 있습니다.

추가로 아래의 페이지에 가서 systemd 스크립트를 실행해 둡니다.

https://github.com/DamionGans/ubuntu-wsl2-systemd-script

그리고 인도우의 홈 디레토려에 .wslconfig 파일을 생성하고 아래의 내용을 넣습니다. 메모리 크기 같은 것은 적절히 원하는 값으로 변경하세요.

[wsl2]

# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=8GB
vmIdleTimeout=-1
#networkingMode=mirrored

# Sets the VM to use two virtual processors
processors=4

결론

WSL2를 리눅스 서버처럼 지속적으로 사용하려면 여러 설정이나 최적화가 필요할 수 있습니다. 그중에서도 wsl --exec dbus-launch true 명령어가 가장 효과적인 해결책이었습니다. 이 방법으로 WSL2를 지속적으로 실행하여 서버 용도로 안정적으로 사용할 수 있게 되었습니다.

데이터 엔지니어와 데이터 사이언티스트의 차이

데이터 엔지니어(Data Engineer)와 데이터 사이언티스트(Data scientist, 데이터 과학자)에 대한 차이에 대한 포스트입니다.

GPT나 Claude에게 물어보면 잘 대답해 주겠지만 그냥 설명하기 쉽게 표로 만들어 봤습니다.

질문 항목데이터 엔지니어데이터 사이언티스트 (데이터 과학자)
무슨 일을 하는가?데이터 처리에 대한 일을 한다.데이터 분석과 활용에 대한 일을 한다.
한마디로 하는 일을 쉽게 설명하면?데이터 저정, 흐름, 이용에 대한 것을 관리한다.데이터의 분석, 재활용을 통해 부가가치 창출과 서비스 고도화를 한다.
일과 시간에 하는 일은?대부분의 시간을 데이터 플랫폼을 다루는데 쓴다.
S3, BigQuery, Hadoop/Hive/Spark
대부분의 시간을 데이터를 분석하고 모델을 만드는데 쓴다.
통계분석, ML/AI 모델링, 모델 성능 분석
주로 사용하는 도구는?개발툴 보다는 터미널, 관리툴 등을 주로 사용한다.개발툴 보다는 주피터노트북이나 모델링을 위한 스크립트 파일을 작성할 수 있는 편집기를 주로 쓴다.
데이터와 관련된 어떤 일을 하는 것인가?ETL과 같은 업무에 깊이 관여하며 데이터가 잘 전송되고 정합성 문제가 없는지 확인하는 것에 중점을 둔다.ETL 보다는 Feature Engineering이나 aggregation 더 깊이 관여하며 정합성 보다는 좋은 통계적 인사이트를 찾거나 모델을 만드는데 더 중점을 둔다.
포지션(일자리) 수요데이터 관련 인프라 유지가 필요한 회사에서만 포지션이 있다.데이터 분석, 데이터 과학을 서비스에 적용할 일이 있는 회사에만 필요
경력이 많아짐에 따라 발전 하는 것어느 정도 경력이 쌓이면 더 발전할 것은 없고 사용하는 솔루션의 종류가 운영 경험이 쌓인다.데이터로 부터 얻을 수 있는 인사이트에 통찰이 생기며 다양한 모델링의 종류와 경험이 쌓인다.
급여 수준일반적으로 개발자 보다 조금 높다일반적으로 개발자 보다 많이 높다

Nginx로 userid (쿠키 세션 ID) 자동 생성하기

세션ID, 쿠키ID

쿠키에서 넣어놓는 세션ID(사용자ID)를 속칭 쿠키ID라고 합니다.

웹사이트나 포털사이트에 비로그인 접속자들을 추적하기 위해서 사용합니다.

구글, 네이버, 온라인광고, 이커머스 등의 사이트에서 사용자의 행적을 추적할 때 가장 많이 사용합니다.

이 비식별 키를 기준으로 사람들의 행동을 쌓아놓은 로그데이터인 행적데이터(로그 데이터)가 빅데이터에서 말하는 대량 데이터의 핵심 중 하나입니다. 이 로그를 분석하면 인사이트가 나옵니다.

로그인하지 않는 경우에는 추천시스템도 이 데이터를 기본으로 만들며 세그멘테이션, 데이터 교환 같은 것도 다 이것을 기준으로 합니다.

생성 방법

예전에는 백엔드서버에서 생성을 해서 쿠키로 생성해주는 방식을 많이 썼지만 NginX에 userid라는 모듈이 있어서 이 일을 대신해주니 편리합니다. NginX 없이 바로 웹서비스를 하는 경우에는 구현이 필요합니다.

보통 랜덤값을 생성해서 16바이트 또는 32바이트 16진수값을 문자열로 바꿔서 넣습니다.

사용자의 IP나 특별한 정보를 넣기도합니다만 쓸모가 없어서 요즘은 잘 하지 않습니다.

userid on;
userid_name uid;
userid_domain example.com;
userid_path /;
userid_expires 365d;
userid_p3p 'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';

만료기간은 기본 1년으로 되어 있지만 넉넉하게 5년쯤으로 넣어 놓으면 됩니다.

셀리니움 “Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다” 없애기

웹사이트에서 접속하는 웹브라우저가 자동제어되는 웹브라우저인지 아닌지 알아낼 수 있습니다.

웹드라이버로 조종되고 있는지 아닌지를 웹 브라우저가 알려주도록 되어 있기 때문입니다. 그걸 이용해서 자동화해서 데이터를 가져가지 못하게 차단하는 웹사이트가 있습니다.

웹사이트에서 차단하지 못하게 웹드라이버로 조종되는지 알려주는 것들을 제거하거나 가리는 방법입니다.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
# user-agent를 일반적인 브라우저와 비슷하게 설정
options.add_argument('--disable-blink-features=AutomationControlled')
# 크롬 드라이버 경로 설정
service = Service(executable_path="path_to_chromedriver")
driver = webdriver.Chrome(service=service, options=options)
# 필요한 작업 수행
driver.get('https://www.example.com')
# 작업 종료 후 드라이버 종료
driver.quit()