본문 바로가기
💻 programming

crontab으로 파이썬 스크립트 예약 작업하기 (+동작안할 때)

by 연구원-A 2023. 4. 14.
반응형

crontab (크론탭)은 UNIX 기반 운영체제에서 작업을 스케쥴링하기 위한 프로그램이라고 한다

특정 시간, 특정 날짜에 반복적으로 작업해야 하는 명령을 예약해둘 수 있다

 

1. crontab에 명령 예약하기

crontab -e

# NVIDIA SDK Manager updater
# NVIDIA SDK Manager updater

# 0 12 */7 * * /bin/bash /home/uni/.nvsdkm/.updater/updater.sh
# 0 10 * * 1-5 python3 /home/uni/Workspace/project/auto-bot/pjt-crawler/crawler.py

crontab -e 명령어를 호출하면 예약된 작업들을 확인할 수 있다

0 10 * * 1-5 python3 /home/uni/Workspace/project/auto-bot/pjt-crawler/crawler.py

 

암호같이 생겼지만 왼쪽부터 차례로

minute(0-59) hour(0-23) day_of_month(1-31) month(1-12) weekday(0-6; 요일) command를 의미한다

 

따라서 0 10 * * 1-5 python3 /home/uni/Workspace/project/auto-bot/pjt-crawler/crawler.py는

  • (command) python3 /home/uni/Workspace/project/auto-bot/pjt-crawler/crawler.py를
  • (weekday: 1-5) 월요일부터 금요일까지
  • (month: *) 매월
  • (day_of_month: *) 매일
  • (hour: 10) 10시
  • (minute: 0) 0분에 실행하는 작업을 의미한다

(= 평일 오전 10시 정각에 crawler.py 파이썬 스크립트를 호출하는 예약 작업)

 

crontab을 등록만 하면 이제 예약 작업은 끝이 난다

 

2. crontab 명령 확인하기 (동작 안할 때)

혹시 1번처럼 작업했는데 예약한 동작이 수행되지 않는다면, 아래 명령어를 호출해서 crontab의 로그를 확인해보자

대부분 상대경로를 사용했거나, 환경변수가 지정되지 않았거나, 실행 권한을 주지 않아 오류가 발생한다고 한다

grep CRON /var/log/syslog

 

3. DISPLAY 지정하기 또는 pyvirtualdisplay 사용하기 (동작 안할 때)

내가 작업한 파이썬 스크립트는 selenium을 사용하는데 브라우저를 열어야 하다보니 DISPLAY 지정이 필요했다

crontab을 실행할 때 DISPLAY에 대한 환경변수가 지정되지 않아서 정상 동작하지 않았는데 stackoverflow에서 해답을 찾았다

 

 

run selenium with crontab (python)

I have a python script that calls chrome via selenium with the next line. ff = webdriver.Chrome('/home/user01/webScraping/CollectAndGo/chromedriver') The python script is called from a shell scr...

stackoverflow.com

 

먼저, PyVirtualDisplay와 Xvfb를 설치한다

pip3 install pyvirtualdisplay
sudo apt-get install xvfb

 

그리고 파이썬 스크립트에서 브라우저를 호출하는 코드에 윈도우 핸들러를 할당한다 (Visible = False)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from pyvirtualdisplay import Display
import time

# Display creates a virtual frame buffer and manages it for you
with Display(visible=False, size=(1200, 1500)):
    driver = webdriver.Firefox()
    driver.get("https://website-target.com")

    time.sleep(1)

    print(driver.current_url) # check connection

    time.sleep(1)

    print(driver.current_url)

    driver.close()

 

나는 3번 방법을 통해 문제를 해결했다

반응형

댓글