[Cron] 크론(Cron) 표현식, 사용법

seulzzang·2022년 9월 19일
0

파이썬/RPA

목록 보기
5/6


크론표현식은 정처기 실기 준비할 때 봤던건데 이 역시 실기를 준비할땐 도대체 어디서 써먹나..했던 것..
자격증 공부의 단점.. 도대체 이걸 어디서 써먹는지 모른다.. 왜냐면 개념만 책으로 공부하니까 외우기 급급함.
정처기 자격증을 따놓고도 이게 도대체 먼지 몰랐던 나.. 대가리박아
일단 내가 cron을 써야하는 이유는 정해진 시간에 매일매일 텔레그램 메시지를 보내야하기 때문이다. 하루에 한번 새로운 게임이 있다면 정해진 시간에 텔레그램 발송 모듈을 실행시켜서 메시지를 전송하는 것.

📍Cron(크론)

  • 유닉스 계열 컴퓨터 운영체제의 시간 기반 잡 스케줄러

📖크론 표현식

👉필드

필드명값의 허용 범위허용된 특수문자
초 (Seconds)0 ~ 59, - * /
분 (Minutes)0 ~ 59, - * /
시 (Hours)0 ~ 23, - * /
일 (Day)1 ~ 31, - * ? / L W
월 (Month)1 ~ 12 or JAN ~ DEC, - * /
요일 (Week)0 ~ 6 or SUN ~ SAT, - * ? / L #
연도 (Year)empty or 1970 ~ 2099, - * /

👉특수문자

* : 모든 값
? : 특정한 값이 없음
- : 범위 (예) 월요일부터 수요일까지는 MON-WED
, : 특별한 값일 때만 동작 (예) 월,수,금 MON,WED,FRI
/ : 시작시간 / 단위  (예) 0분부터 매 5분 0/5
L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)
W : 가장 가까운 평일 (예) 15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾음
# : 몇째주의 무슨 요일을 표현 (예) 3#2 : 2번째주 수요일
우와. 이거 다 정처기 공부할 때 외웠던 거다.
근데 이렇게 외울 필요 없다.👉crontab guru 아주 친절한 사이트가 있음😊

  • crontab -e 명령어로 설정파일에 접근
  • 최초 파일 접근 시 editor 설정 (vim.tiny로 선택해줬다. 아마 3번)
  • crontab -l로 제대로 바뀌었는지 확인도 가능하다.
    • 나의 경우 ec2서버에서 작업중이기 때문에 여기서 cron을 설정해주면 된다.

      이렇게 입력하면 표현식을 입력할수 있는 에디터에 접근 가능하다.

      i를 눌러서 insert할 수 있게 진입하고, 맨 아래로 내려가서 표현식과 내가 사용하는 python, 정해진 시간마다 실행시켜줄 파일의 파일경로를 차례대로 입력해주면 된다.
      로그를 확인하고 싶다면 이 뒤에 >>를 붙이고 로그를 저장해줄 경로를 입력해주면 됨.
      편집을 끝내고 싶다면 esc를 누른 다음 :wq를 눌러서 저장하고 나올 수 있다.
      일단 내 표현식을 확인해보면 매 10분마다 지금 실행을 하고 있다.
      왜냐면.. 지금 안됨. 상대경로 오류로 않됨.

      그래서 1분마다 돌리고 있었는데 그럼 ec2서버에 과부하걸려서 자꾸 서버가 재연결 하길래;; 일단 크론은 사용 안하는 중.
      지금 상대경로 문제로 살짝 골때리는 중이다.
      이상.
      나중에 성공하면 돌아옴...ㅠ

✍+)파일경로에 대하여

내가 생각하기에는 현재 작업중인 디렉토리로 변경해주고 이를 현재 경로로 지정해준 다음에 os.chdir을 해주면 정상적으로 작동하리라 생각했다. 근데 이렇게하고 크론을 실행하면 현재 작업디렉토리가 /home/ubuntu가 되어서..(되게 당연한 건데 이걸 왜 저게 된다고 생각했는지) 내가 필요한 디렉토리인 /home/ubuntu/seulki_package/Crawling에 접근하지 못했다. 근데 되게 당연한건데.. 그냥 존나 빡대가리처럼 생각을 했던 것이다. 당연히 내가 필요한건 파일경로고.. 나는 여태 그냥 내가 작업중인 디렉토리에만 접근해서 생긴 일이었다.
당연히 main_telegram.py에서 실행할땐 디렉토리가 ./Crawling이고 크론은 우분투에서 작동하니까..ㅡㅡ 개짜증 이런걸 헷갈려하고 있음.

💻pathlib 사용하기

보통 파일경로나 뭐 디렉토리에 접근하려면 os를 이용 많이하는데, pathlib은 이 파일경로를 문자열이아닌 객체로 얻을 수 있게 해준다.
pathlib 모듈을 사용하면, 파일, 디렉토리(폴더)의 경로를 객체로써 조작하거나 처리할 수 있다. 이것또한 강사님이 알려주신..(갓사님)
내가 헤매니까 결국 코드 알려주심.. 감사합니다 오늘 숨넘어가서 죽을뻔햇어요

os.chdir(pathlib.Path(__file__).parent.absolute())

위 코드를 보면,
__file__ : 현재 파일
Path : 현재 파일의 경로를 객체화 하여 표현
parent :

import pathlib
path = pathlib.Path('/user/path/to/file')

print(path) # /user/path/to/file
print(path.parent) # /user/path/to

위의 결과로 .parent는 현재 파일이 존재하는 곳의 상위 디렉토리까지만 표현을 해주는.. 말그대로 부모 디렉토리. (이 파일을 품고있는 디렉토리)
absolute : 절대경로
정리를 하자면 현재파일의 경로를 절대경로로 나타내어 준 것이다.
크론은 항상 /home/ubuntu에서 실행해주기 때문에 크론을 실행할 때 상대경로를 그냥 ./telegram_config이렇게 해버리면 /home/ubuntu/telegram_config의 파일을 읽으니 당연히 디렉토리에 파일이 없다는 오류가 뜨는 것..
그래서 저렇게 현재 파일의 경로를 절대경로로 나타내준 곳으로 디렉토리를 바꿔주고 그냥 telegram_config를 해주면 된다.
그냥 내 컴퓨터에서만 실행하는거면 그 파일의 절대경로를 복사해서 붙여주면 되지만 다른 사람의 컴퓨터에서 실행한다고 했을때 그러면 오류가 날것이니까! 저렇게 경로를 지정해주는 것이다!!
오늘도 하나 배웠다..흑흑

profile
중요한 것은 꺾이지 않는 마음

0개의 댓글