본문 바로가기
Unix, Linux

[Unix] cron crontab

by 혀나Lee 2016. 10. 13.

Cron

Cron은 Linux, unix 운영체제에서 어떤 작업을 특정 시간에 실행시키기 위한 데몬이다. 예를 들어 하루에 한차례 특정 서버에 접속해서 데이터를 받아와야 한다든지, 아니면 새벽 3시에 특정 작업을 수행할 필요가 있다던지, 이런 식으로 일정한 시간 간격으로 수행되어야 할 작업이나 사용자가 그시간에 작업을 할 수 없는 상황일때, 서버는 항상 돌아가고 있다는 점을 이용하는 방법이다.

Crontab

Crontab이란 cron 작업을 설정하는 파일이다. (crontab 파일은 OS 별로 각각 다른 위치에 저장이 되는데 일반적으로 BSD 계열의 리눅스는 /var/spool/cron/ID, 솔라리스 계열은 /var/spool/cron/contabs/ID 에 위치하고 있다. 파일을 보면 알겠지만 각각의 ID 별로 수행되어야 할 작업이 하나의 파일에 저장된다.) cron 작업을 설정하기 위해서는 crontab 명령어를 사용하여 파일을 수정할 수 있다.

Cronjob

Cronjob 이란 Linux/Unix 기반에서 작업의 스케줄을 지정할 수 있는 스크립트이다.

cron 사용하기

cron 및 crontab 명령어

# cron 설치 확인

ihyeon-aui-MacBook-Pro:~ ihyeon-a$ cron

cron     crontab 

# 실행중인 cronjob 확인 crontab 

ihyeon-aui-MacBook-Pro:~ ihyeon-a$ crontab -l

crontab: no crontab for ihyeon-a


# crontab 파일 수정

ihyeon-aui-MacBook-Pro:~ ihyeon-a$ crontab -e

crontab 파일의 형식

cron의 항목은 분, 시, 일, 월, 요일, 실행할 명령의 여섯 부분으로 이루어집니다.

# 분 시 일 월 요일 명령
# * * * * * 실행할 명령 # ┬ ┬ ┬ ┬ ┬ # │ │ │ │ │ # │ │ │ │ │ # │ │ │ │ └───── 요일(0 - 7): 0에서 6까지 일요일에서 토요일, 혹은 이름을 사용. 7도 일요일임 # │ │ │ └────────── 월(1 - 12) # │ │ └─────────────── 일(1 - 31) # │ └──────────────────── 시(0 - 23) 
# └───────────────────────── 분(0 - 59)

예시

python 스크립트를 사용한 크론 배치 프로그램 만들기

1. cron으로 주기적으로 실행시켜줄 스크립트 파일 만들기 (저는 python을 이용했습니다.)

test.py

import psycopg2
import sys
 
def main():
conn_string = "host='localhost' dbname='postgres' user='postgres' password=''"
# print the connection string we will use to connect
print "Connecting to database\n ->%s" % (conn_string)
 
# get a connection, if a connect cannot be made an exception will be raised here
conn = psycopg2.connect(conn_string)
 
# conn.cursor will return a cursor object, you can use this cursor to perform queries
cursor = conn.cursor()
 
# execute our Query
cursor.execute("UPDATE t_check_client_ip SET login_count = login_count + 1;")
 
conn.commit()
cursor.close()
 
if __name__ == "__main__":
main()

2. 실행 권한 주기

# tset.py 파일에 실행 권한 주기
ihyeon-aui-MacBook-Pro:Desktop ihyeon-a$ chmod +x test.py 

# 권한 확인

ihyeon-aui-MacBook-Pro:Desktop ihyeon-a$ ls -al test.py 

-rwxr-xr-x@ 1 ihyeon-a  staff  639 10 13 15:08 test.py

3. crontab -e 명령어를 사용하여 추가

crontab -e 명령어로 파일을 열고 저장한 상태
ihyeon-aui-MacBook-Pro:Desktop ihyeon-a$ crontab -e
crontab: installing new crontab
파일 수정
* * * * * /usr/bin/python /Users/ihyeon-a/Desktop/test.py

4. crontab -l 명령어를 사용하여 실행중인 작업 리스트 확인

ihyeon-aui-MacBook-Pro:Desktop ihyeon-a$ crontab -l

* * * * * /usr/bin/python /Users/ihyeon-a/Desktop/test.py

한글 문제 (utf-8)

cron에 넣은 python script가 제대로 동작하지 않을 때 원인은 script 에 error 가 있는 것이다. 
제일 먼저 알아야 할 것은 "cron 은 shell 과 환경이 다르다." 이다. 즉 shell 환경에서는 잘 실행되는 script 코드가 cron 에 넣으면 실행이 안된다면 그 둘의 실행 환경이 다르기 때문일 가능성이 높다.

예제

def test_cron():
    print(1)
    msg = "한글 메시지"
    print(msg)

예를 들어, 위의 test_cron() 함수가 cron 에 추가되어 있다고 해보자. shell 환경에서 test_cron() 함수를 실행하면 아마 숫자 1과  "한글 메시지"가 잘 출력되어 나올 것이다. 하지만 cron 을 돌리면 숫자 1만 출력되고 "한글 메시지"가 출력되지 않을 것이다. 
이유는 shell 에서는 대부분의 환경이 default encoding 으로 ko_KR.UTF-8 으로 되어 있어서 잘 나온다.(echo $LANG 으로 확인 가능) 하지만, cron 에서는 shell 의 인코딩을 끌고 가는 것이 아니라 encoding error 를 내고 실행이 중단될 수 있다. 이를 피하기 위해서는 python 의 기본 입출력 인코딩이 utf8 이라는 것을 명시적으로 지정해줘야 한다. 

해결 방법

아래와 같이 crontab -e 명령어를 통해 cron 파일을 열고 파일 상단에 'PYTHONIOENCODING=utf8 ' 을 작성해 준다.

$ crontab -e

PYTHONIOENCODING=utf8 
* * * * * /usr/bin/python /Users/ihyeon-a/Desktop/test.py


'Unix, Linux' 카테고리의 다른 글

[Mac] PORT 사용중인 프로세스 보기 및 죽이기  (0) 2016.12.13
[Ubuntu] ssh 설치 및 실행  (0) 2016.11.24
[Linux] zip 압축, 압축풀기  (0) 2016.11.03
[Linux] 명령어  (0) 2016.11.02
[Linux] grep 명령어  (0) 2016.10.27

댓글