동서발전 태양광 발전량 예측 AI 경진대회

Linux 시스템에서 스케줄링을 통한 코드 자동 실행

2021.06.10 19:14 4,938 조회

원하는 조건이나 시간에 코드를 돌리는 방법은 다양하지만

가장 간편하고 안정적인 방법은 cron service가 아닐까 싶습니다.

혹시라도 윈도우 시스템이라면 windows scheduler을 사용한 방법을 이용하거나 nnCron을 사용하시면 되는데

오늘은 리눅스 시스템에서의 cron만 알아보고 다음에 nnCron 사용법에 대해서 간략히 다뤄보겠습니다.


일단 /etc/crontab에 위치한 파일을 수정할겁니다.

# execute following command in terminal
# ctrl+alt+T to open terminal

sudo nano /etc/crontab


nano는 문서 수정 서비스 명령어입니다.

정상적으로 실행됐다면 아래와 같을겁니다(비밀번호 입력 필요)


# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.


SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin


# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,>
# | | | | |
# * * * * * user-name command to be executed


위와같이 설명이 나오지만 처음보면 어떻게 사용하는지 잘 이해가 안될 수 있습니다.

크게 앞부분인 * * * * * 와 뒷부분인 user-name command 로 나뉩니다.

앞부분부터 예시를 들자면


* * * * * 매분

0 * * * * 매시

30 * * * * 매시 30분마다

0 11 * * * 매일 11시 정각마다

30,40 23 * * * 매일 저녁 11시30분, 11시40분 마다


이정도만 아셔도 사용하시는데 지장 없으실겁니다.


뒷부분은 user-name 부분에 유저 이름을, command 부분에 명령어를 사용해주시면됩니다.

python 코드 실행 커맨드는 주로 아래와 같습니다.

#system python, 아래에서 usr, py파일 경로는 적절히 변경
python ~/Desktop/project/main.py

#conda 환경 python으로 실행, 아래에서 usr, py파일 경로는 적절히 변경
~/anaconda3/envs/env_name/bin/python ~/Desktop/project/main.py


여기에 아까 스케줄을 의미하는 5개 별 또는 숫자로 수정한 부분을 붙쳐서 crontab 파일에 추가하시면 됩니다.

예를들면 이 대회를 위해서 매일 11시 15, 30, 45분에 코드를 돌린다고 하면


15,30,45 23 * * * usr ~/anaconda3/envs/env_name/bin/python ~/Desktop/project/main.py


이렇게 하면 env_name이라는 conda 환경으로 경로의 main.py를 매일 11시 15,30,45분에 총 3회 실행하게 됩니다.


만약 로그를 저장하고 싶다면 뒤에 아래 코드를 붙쳐주시면 됩니다.

path_to_logfile 과 logfile_name을 적절히 수정해 주시면 됩니다. ".log"는 로그파일 확장자 입니다.

>> path_to_logfile/logfile_name.log 2>&1


위에 예시를 이어서 설명하면 아래와 같이 crontab 파일 아래줄에 저장해 주시면 됩니다.

15,30,45 23 * * * usr ~/anaconda3/envs/env_name/bin/python ~/Desktop/project/main.py >> ~/Desktop/project/history.log 2>&1


처음에는 낯설고 어려운것 같지만 알아두면 편한 cron 설정법이였습니다.

감사합니다.

로그인이 필요합니다
0 / 1000
도비콘
2021.06.10 23:04

고파라🦆님 👩🏻‍💻꼭 필요했는데 감사합니다.

고라파덕
2021.06.10 23:52

url 형태로 제출까지 가능했다면 제출까지 자동화 가능했을텐데
수동 제출이라 조금 아쉽네요 ㅠ