> 백엔드 개발 > 파이썬 튜토리얼 > systemd를 사용하여 Selenium을 Linux 데몬으로 설정하는 방법

systemd를 사용하여 Selenium을 Linux 데몬으로 설정하는 방법

Mary-Kate Olsen
풀어 주다: 2024-10-18 18:17:29
원래의
551명이 탐색했습니다.

How to Set Up Selenium as a Linux Daemon with systemd

Ubuntu 또는 Debian에서 Chrome 및 Selenium을 설정하고 실행합니다. 본 가이드는 우분투 22.04를 기준으로 작성되었습니다

Selenium은 웹 작업 자동화에 적합하지만 서버에서 봇을 연중무휴로 실행하는 것은 까다로울 수 있습니다. systemd를 사용하면 Selenium 봇을 백그라운드 서비스(데몬)로 실행하여 안정적으로 실행되고 실패 시 다시 시작되도록 할 수 있습니다. 이 가이드는 Linux VPS용 구성에 중점을 두고 설정 단계를 안내합니다.

목차

  1. Google 크롬 설치

  2. 가상환경 설정

  3. 필요한 패키지 설치

  4. Python 스크립트 생성

  5. systemd 서비스 설정

    • ENV 변수 추가(선택 사항)
    • 서비스 파일
    • 서비스 실행
  6. 블록 버퍼링 문제 해결

    • -u 플래그 사용
    • Print Flush 인수 사용
  7. journalctl을 사용하여 로그에 액세스

  8. 참고자료


구글 크롬 설치

먼저 모든 패키지를 업데이트합니다.

sudo apt update
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

안정적인 Google Chrome 패키지를 다운로드하세요.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

Google 크롬을 설치하세요.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

설치된 구글 크롬 버전을 확인하세요.

google-chrome --version
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

가상 환경 설정

컴퓨터에서 Selenium 봇만 실행하는 경우에는 이 단계가 필수가 아닙니다. 하지만 다른 프로젝트를 진행 중이거나 격리된 환경이 필요한 경우에는 권장됩니다.

가상 환경을 만들어 보겠습니다.

python3 -m venv venv
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

가상환경을 활성화하세요.

source venv/bin/activate
로그인 후 복사
로그인 후 복사

필요한 패키지 설치

이제 Selenium과 webdriver-manager를 설치합니다.

pip install selenium
pip install webdriver-manager
로그인 후 복사

webdriver-manger의 목적은 다양한 브라우저의 바이너리 드라이버 관리를 단순화하는 것입니다. 해당 문서에서 이에 대해 자세히 알아볼 수 있습니다.


Python 스크립트 만들기

## main.py

from selenium import webdriver
## ---- Use for type hint ---- ##
from selenium.webdriver.chrome.webdriver import WebDriver
## --------------------------- ##
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager


def create_chrome_web_driver_connection(headless: bool,
                                       detach:bool,
                                       use_sandbox: bool,
                                       use_dev_shm: bool,
                                       window_width: int = 1052,
                                       window_height: int = 825
                                       ) -> WebDriver:

    service = Service(ChromeDriverManager().install())
    options = Options()
    options.add_experimental_option("detach", detach)
    options.add_argument(f"--window-size={window_width},{window_height}")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-renderer-backgrounding")
    options.page_load_strategy = 'normal'

    if not use_sandbox:
        options.add_argument('--no-sandbox')
    if not use_dev_shm:
        options.add_argument('--disable-dev-shm-usage')
    if headless:
        options.add_argument("--headless=new")

    driver = webdriver.Chrome(service= service, options=options)

    return driver



if "__main__" == __name__:
    driver =  create_chrome_web_driver_connection(headless= True,
                                                 detach= False,
                                                 use_sandbox= False,
                                                 use_dev_shm= False)

    driver.get('https://python.org')
    print(driver.title)

    driver.close()

로그인 후 복사

options.add_experimental_option("detach", detach) :

  • 이를 통해 스크립트 실행이 완료된 후에도 Chrome 브라우저를 계속 열어둘지 여부를 구성할 수 있습니다.
  • detach가 True이면 WebDriver 세션이 종료된 후에도 브라우저 창이 계속 열려 있습니다.

options.add_argument(f"--window-size={window_width},{window_height}") :

  • 브라우저의 창 크기를 너비와 높이로 설정합니다.

원하시면 이 줄을 제거하실 수 있습니다.
헤드리스 모드에서 Selenium을 실행하려는 경우 창 크기를 이 방법으로 설정해야 합니다. 그렇지 않으면 내 경험상 기본 창 크기가 너무 작을 수 있습니다.

driver.get_window_size() 명령으로 창 크기를 확인할 수 있습니다

options.add_argument("--disable-extensions") :

  • 확장 프로그램은 자동화된 브라우저 상호 작용을 방해할 수 있으므로 확장 프로그램을 비활성화하면 안정성이 향상될 수 있습니다.

options.add_argument("--disable-renderer-Backgrounding") :

  • 이렇게 하면 Chrome이 배경 탭의 우선순위를 낮추거나 일시중지하는 것을 방지할 수 있습니다.
  • 이 기능은 여러 탭에서 작업을 수행할 때 유용할 수 있습니다.

options.page_load_strategy = '정상' :

  • 이것은 페이지 로드 전략을 일반으로 설정합니다. 즉, Selenium은 추가 명령을 진행하기 전에 페이지가 완전히 로드될 때까지 기다립니다.
  • 다른 옵션으로는 즉시(DOMContentLoaded 이벤트가 발생할 때까지 대기) 및 없음(페이지가 로드될 때까지 기다리지 않음)이 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다.

options.add_argument('--no-sandbox') :

  • 샌드박스는 브라우저의 프로세스를 격리하는 Chrome의 보안 기능입니다.
  • 비활성화(--no-sandbox)는 샌드박스가 권한 문제나 충돌을 일으키는 일부 테스트 환경(예: Docker 컨테이너 또는 루트 사용자로 스크립트를 실행할 때)에서 유용할 수 있습니다.

options.add_argument('--disable-dev-shm-usage') :

  • /dev/shm은 Linux 환경에서 자주 사용되는 공유 메모리 공간입니다. 기본적으로 Chrome은 성능 향상을 위해 이를 사용하려고 합니다.
  • 이 기능을 비활성화하면(--disable-dev-shm-usage) 공유 메모리가 제한된 환경에서 충돌을 방지할 수 있습니다.

options.add_argument("--headless=new") :

  • 이렇게 하면 GUI 없이 Chrome을 실행하는 헤드리스 모드가 활성화됩니다.
  • 헤드리스 모드는 CI/CD 파이프라인이나 원격 서버 등 디스플레이가 없는 환경에서 실행하는 데 유용합니다.

시스템 서비스 설정

ENV 변수 추가(선택 사항)

셀레늄 프로그램이 환경 변수를 사용해야 하는 경우 이를 달성할 수 있는 두 가지 방법이 있습니다.

  1. python-dotenv와 같은 라이브러리와 함께 .env 파일 사용(가장 일반적이고 대중적인 방법).

  2. systemd의 내장 옵션을 사용하여 환경 파일 설정

이 예에서는 두 번째 옵션을 사용하겠습니다.

먼저 /etc 디렉토리 안에 conf.d 디렉토리를 생성해 보겠습니다.

sudo apt update
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

다음으로 일반 텍스트 파일을 만듭니다(이것이 환경 파일이 됩니다).

sudo apt update
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이제 방금 생성한 파일에 환경 변수를 추가할 수 있습니다.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

환경 변수를 사용하도록 Python 스크립트를 수정하세요.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

서비스 파일

이 /etc/systemd/system/ 디렉터리 내에 서비스 파일을 생성해야 합니다. 여기에는 시스템 관리자가 설치한 시스템 장치가 배치되어야 합니다.

google-chrome --version
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 예에서는 귀하가 VPS에 있고 루트 사용자로 서비스를 실행하려고 한다고 가정합니다.

[!경고]
서비스는 루트(관리자) 권한으로 실행됩니다. 이렇게 하면 시스템에 대한 전체 액세스 권한이 부여되지만 보안상의 이유로 필요한 경우가 아니면 루트로 실행하는 것은 일반적으로 피됩니다.

서비스 파일에 추가하세요.

python3 -m venv venv
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

[단위] 섹션

이 섹션에서는 서비스에 대한 메타데이터와 종속성을 정의합니다.

Description=Selenium Bot Service : 서비스가 수행하는 작업에 대한 간단한 설명을 제공합니다. 이 경우에는 "Selenium Bot Service"라고 설명합니다. 이 설명은 시스템 로그 및 systemctl에서 서비스를 식별하는 데 사용됩니다.

After=network.target: 네트워크를 사용할 수 있게 된 후에만 서비스가 시작되도록 합니다. network.target은 기본 네트워킹 기능이 작동 중임을 나타내는 systemd 대상입니다.

[서비스] 섹션

이 섹션에서는 서비스 실행 방법, 실행하는 사용자, 실패할 경우 수행할 작업 등 서비스 자체의 구성을 지정합니다.

사용자 : 서비스를 실행할 사용자를 지정합니다. 여기서는 루트로 설정되어 있습니다.

EnvironmentFile : 서비스에서 사용하는 환경변수가 포함된 파일을 지정합니다.

WorkingDirectory: 서비스가 실행될 디렉터리를 지정합니다. 이는 서비스 프로세스의 작업 디렉터리입니다. 여기서 봇 파일은 /root/selenium_bot/

에 저장됩니다.

ExecStart : 서비스를 시작하는 명령을 정의합니다. 여기서는 /root/selenium_bot/

에 있는 main.py 파일을 실행합니다.

Restart=on-failure : 서비스가 실패(예: 0이 아닌 종료 상태)로 종료되는 경우 자동으로 다시 시작하도록 구성합니다. 이는 가끔 오류가 발생하더라도 봇 서비스가 계속 실행되도록 하는 데 유용합니다.

RestartSec=5s : 실패 시 재시작 간의 지연 시간을 지정합니다. 이 경우 서비스는 실패 후 다시 시작을 시도하기 전에 5초 동안 대기합니다.

StandardOutput=journal : 서비스의 표준 출력(stdout)을 저널ctl을 사용하여 볼 수 있는 시스템 저널로 리디렉션합니다. 이는 로깅 및 디버깅 목적에 유용합니다.

StandardError=journal : 표준 오류(stderr) 출력을 시스템 저널로 리디렉션합니다. 서비스에서 발생한 모든 오류는 기록되며 Journalctl을 사용하여 볼 수도 있습니다

[설치] 섹션

이 섹션에서는 서비스를 활성화하거나 시작하는 방법과 시기를 정의합니다.

WantedBy=multi-user.target : 서비스를 활성화해야 하는 대상을 지정합니다. 이 경우 multi-user.target은 시스템이 비그래픽 다중 사용자 모드(서버에서 일반적)일 때 도달하는 systemd 대상입니다. 이는 시스템이 이 대상에 도달하면 일반적으로 시스템이 다중 사용자 환경으로 부팅될 때 서비스가 시작된다는 것을 의미합니다.

시스템 서비스에 가능한 모든 설정에 대해 자세히 알아보려면 참조를 확인하세요

서비스 실행

서비스 파일이 유효한지 확인해 보겠습니다. 모든 것이 정상이면 아무것도 표시되지 않습니다.

sudo apt update
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

시스템 구성을 다시 로드하여 새롭거나 수정된 ​​장치(서비스)를 찾습니다.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

서비스를 시작/다시 시작하세요.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

서비스를 중지하세요.

google-chrome --version
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

서비스 상태를 확인하세요.

python3 -m venv venv
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

부팅 시 서비스가 자동으로 시작되도록 하려면 이 작업을 수행하세요.

source venv/bin/activate
로그인 후 복사
로그인 후 복사

블록 버퍼링 문제 해결

Python의 대화형 환경에서 스크립트를 실행할 때(예: 터미널에서 python3 filename.py를 수동으로 실행하는 경우) Python은 라인 버퍼링을 사용합니다. 이는 print() 문의 출력과 같은 출력이 즉시 표시된다는 의미입니다.

그러나 Python 프로그램이 비대화형 환경에서 실행되는 경우(이 경우) 출력은 블록 버퍼링을 사용합니다. 이는 버퍼가 가득 차거나 프로그램이 종료될 때까지 프로그램이 출력을 버퍼에 보관하여 로그/출력을 볼 수 있을 때까지 지연된다는 것을 의미합니다.

여기에서 Python의 출력 버퍼링 작동 방식에 대해 자세히 알아볼 수 있습니다.

로그와 출력을 실시간으로 확인하고 싶기 때문에 두 가지 방법으로 이 문제를 해결할 수 있습니다.

-u 플래그 사용

python3 문서에 이에 대한 내용이 나와 있습니다.

-u stdout 및 stderr 스트림을 강제로 버퍼링 해제합니다. 이 옵션은 stdin 스트림에 영향을 미치지 않습니다

-u 플래그를 사용하면 Python은 stdout 및 stderr 모두에 대해 완전히 버퍼링되지 않은 모드에서 작동합니다. 이는 각 바이트가 생성되자마자 터미널(또는 로그 파일과 같은 출력 스트림)로 직접 전송된다는 것을 의미합니다. 버퍼링이 전혀 발생하지 않습니다.

일반적으로 stdout으로 이동하는 모든 문자(예: print() 문 또는 오류)는 전체 라인이나 버퍼가 누적될 때까지 기다리지 않고 바이트 단위로 즉시 기록됩니다.

이 옵션을 사용하려면 다음과 같이 스크립트를 실행하세요.

sudo apt update
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 옵션을 선택하는 경우 서비스 파일 내에서 ExecStart를 수정해야 합니다.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

Print Flush 인수 사용

Python에서 print() 함수는 기본적으로 출력을 버퍼링합니다. 즉, 출력을 메모리에 저장하고 버퍼가 가득 차거나 프로그램이 종료될 때만 출력합니다. 플러시=True를 사용하면 Python이 print() 호출 직후 출력을 플러시하도록 강제하여 출력이 즉시 표시되도록 할 수 있습니다.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

Journalctl을 사용하여 로그에 액세스

시스템 장치(서비스)의 전체 로그 기록을 보려면 다음 명령을 사용하세요.

google-chrome --version
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

로그를 실시간으로 모니터링하려면 -f 플래그를 사용하세요. 이렇게 하면 가장 최근의 저널 항목만 표시되며 저널에 추가되는 새 항목이 계속해서 인쇄됩니다.

python3 -m venv venv
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

참고자료

  • https://github.com/password123456/setup-selenium-with-chrome-driver-on-ubuntu_debian
  • https://www.selenium.dev/documentation/webdriver/drivers/options/
  • https://www.lambdatest.com/blog/selenium-page-load-strategy/
  • https://pypi.org/project/webdriver-manager/
  • https://pypi.org/project/python-dotenv/
  • https://wiki.archlinux.org/title/Systemd
  • https://man.archlinux.org/man/systemctl.1
  • https://man.archlinux.org/man/systemd.service.5.en#EXAMPLES
  • https://man.archlinux.org/man/systemd-analyze.1
  • https://docs.python.org/3/using/cmdline.html#cmdoption-u
  • https://realpython.com/python-flush-print-output/
  • https://man.archlinux.org/man/journalctl.1

위 내용은 systemd를 사용하여 Selenium을 Linux 데몬으로 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿