Mac 맥에서 파이썬 파일 자동화 크론탭
파이썬 크롤링

Mac 맥에서 파이썬 파일 자동화 크론탭

Mr.Zee 2022. 8. 17.

크론탭이란? 윈도의 스케줄러와 비슷한 기능의 리눅스 쉘에서 작동하는 명령어

위와 같이 crontab -l 명령어를 활용하면 현재 사용 중인 스케줄 기능을 출력해준다.

이 글을 보고 있는 가장 큰 목적은 crontab -e에 대한 부분일 텐데 리눅스는커녕 터미널에 자주 들어가 본 적 없는 이들에게 크론탭은 말 그대로 지옥을 선사한다. 이거 하나 때문에 shell script부터 Vim이나 nano script 등 애꿎은 편집기를 건드리게 되질 않나

정말 많은 시간을 빼앗겼었는데 오늘은 이 기능에 대해 최대한 오류에 대한 부분을 많이 설명하고 넘어가려고 한다.

왜냐하면 크론탭은 윈도우 스케줄러와 다르게 사용자가 알맞은 시간 패턴을 지정해줘야 하고
나아가서 우리가 만든 파이썬 스크립트가 리눅스 쉘 스크립트가 알아먹을 수 있는 형태로 만들어져야 한다.

해외 포럼 등에서는. sh 파일 등을 만들어서 활용하는 방안 등을 소개하고 있는데 그런 거 다 필요 없다. py파일로도 충분히 실행할 수 있다.

크론탭 구조

크론탭은 기본적으로 5자리의 시간 + 파이썬(가상) 경로 + 파이썬 파일 경로 + 로그 지정의 형태로 사용할 수 있다.

0 17 * * * /Users/a/venv/bin/python /Users/a/kb_crawling.py command arg >> /Users/a/date.log 2>&1

    시간                              ㄴ 파이썬 경로 (가상 환경)                                 ㄴ 로그 지정 및 경로

위 예시를 풀이하자면 17시에 파이썬이 설치되어 있는 경로에서 파이썬을 실행해서 kb_crawling.py 란 파일을 실행시키고,

해당 로그를 dete.log에 저장하라는 내용이다.
date.log에는 print 내용 혹은 log 지정한 내용이 담기며, 지속해서 누적되기 때문에 로그는 간단하게 만들 필요가 있다.

자 이제 간단히 구조를 알았으니 예제를 통해서 스크립트를 실행시키는 방법을 좀 더 자세히 알아보자.

크론탭의 시간 결정

크론탭의 시간 구조는 총 5자리로 띄어쓰기로 구분된다.

분 (0-59)  시간 (0-23)  일(1-31)  월(1-12)  요일(0-7)의 5자리로

매분 실행한다면
* * * * *

매주 토요일 오전 9시 30분 실행이라면

30 9 * * 6

매일 매시간 10분, 40분, 45분 반복 실행이라면 

10,40,45 * * * *

이런 방식으로 사용할 수 있다.

크론탭의 저장과 수정

크론탭에서 수정은 crontab -e를 통해서 한 줄씩 타이핑을 진행해야 한다.

한 줄이 오버되더라도 엔터로 구분자를 넣지 않았으면 괜찮으니 신경 쓰지 말고 타이핑하도록 하자.
타이핑보다는 아래 후술 하듯이 어딘가에 미리 써놓거나 경로 자체를 Cntrl+V로 붙여 넣기가 제일 좋다.

이제 저장할 때가 중요한데

esc를 누르기 전 크론탭

ESC 버튼을 누른 후

:wq를 입력하고 엔터를 쳐야 저장하고 빠져나올 수 있다.

esc 누르고 타이핑을 시작하면 아래로 커서가 옮겨지면서 입력된다.

관련해서 VIM 에디터나 NANO에디터 사용법을 익혀두면 조금 더 편리하지만 필요 없더라... 괜히 시간만 낭비했.....ㅠ

아 추가로 지우기는 crontab -r이지만 입력했두었던게 다 지워지니 신중하게 사용하자.

자주 하는 실수 모음

1. 띄어쓰기 & 오탈자.

크론탭의 구분은 띄어쓰기이기 때문에 명령어를 추가하는 경우 ; 혹은 &을 자주 쓴다.
이 띄어쓰기 하나로 작동을 하고 안하고의 경우가 있지만 절대다수의 경우는 오탈자가 크다. 특히 경로는 오탈자 유발이 심하기 때문에 웬만하면 터미널 등에서 경로를 복사 & 붙여 넣기로 작업하자.

특히 1개 라인에 1개 명령어로 인식하기 때문에 엔터 등을 구분자로 넣는 데에 꼭 조심해야 한다.

2. 절대 경로 & 상대 경로. (파이썬 스크립트 내부 포함)

파이썬 스크립트 실행을 위해서 상대 경로를 자주 쓰는 편인데 스크립트 내부에서도 절대 경로를 써야 한다. 상대 경로의 가장 큰 문제점은 파이썬 코드 실행이 루트 폴더에서 시작하는 게 아니라 특정 폴더에서부터 시작하기 때문에 여기서부터 모든 게 꼬여버린다.

가장 간단한 예로 파이어폭스 geckodriver를 불러오는데 단순히 /geckodriver로 호출하면 바로 오류부터 발생하게 될 것.

여기가 가장 오류의 큰 적인 셈.

3. 쉘 스크립트

당장 스택 오버 플로우만 가도 sh파일로 만들어서 실행하라고 되어 있다. sh 파일로 실행하는 경우, 환경변수 설정이 내 컴퓨터의 터미널 쉘이 zsh 방식인 지부 터해서 모든 게 다 알맞아야 한다......!

파이썬 파일과 마찬가지로 sh 또한 절대 경로 지정으로 어느 정도 해결은 볼 수 있지만 문제는 셀레늄처럼 의존성을 가지는 파일들은 난리가 나버렸던 경험..... 

크론탭 경로 연습 실전처럼 (파이 참 IDE에서)

파이 참에서 실제로 크론탭으로 파이썬 파일을 하나 자동화시켜보는 걸 보여드리고자 한다.

여러 파일을 시간대별로 돌리고 있다.

여기서 자동화 파일을 추가하기 전에 폴더 구조부터 체크해보자.
먼저 py파일은 파이 참 프로젝트 폴더 안에 있고 해당 폴더에 A라는 폴더를 만들어서 활용 중이다.

 

파이썬의 경우 파이 참 가상 환경을 그대로 사용하기 위해서 마찬가지로 A폴더에 venv/bin 내의 python 이 존재한다.

venv 말고 일반 파이썬 경로로 설정하는 순간 멘붕을 맞볼 수도 있다. 물론 기본 파이썬에도 관련 라이브러리가 다 설치되어 있으면 큰 상관은 없을 텐데 관리의 어려움은 증폭된다.

이런 식으로 내 파이썬 파일의 경로와 가상 환경 내 파이썬의 절대 경로를 취득한 이후부터는 쉽다.

crontab -e

명령어를 치고 들어가서 알맞은 크론 내용을 써준 뒤에 esc 후 :wq를 눌러서 저장!

그 이후부터는 제대로 실행되었는지를 로그파일 혹은 크론탭 옵션에 display=0 정도를 추가해주면 된다.

 

실제로 복잡한 파이썬 코드일수록 간단한 것 때문에 오류가 날 가능성 Up.

전문 개발자들이야 주변에서 조언을 얻거나 리눅스를 아는 분들께 조언을 구해서 금방 헤쳐나갈 수 있는 부분들이지만,
전문 지식은커녕 배워나가고 있는 입장에서 크론탭에서 오류 날 때면 곡소리가 절로 나온다.

윈도는 쉬운데 어째서 잡스 님.....!! 하면서 원망해봤자 돌아오는 것은 없기 때문에 지속적으로 여러 방면에 걸쳐 시도해보자.
특히 절대다수의 경우는 환경변수 설정과 가상 환경 간의 미스매치로 인해 발생하기 때문에 이 부분을 중점적으로 캐치해보고 그래도 해결이 안 되는 경우엔 댓글로 남겨주면 살펴보고 조언을 남겨보도록 하겠다.

댓글

💲 추천 글