Home Linux Crontab
Post
Cancel

Linux Crontab

핵심 요약


1
2
*      *      *      *      *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

crontab을 공부하게 된 배경


백엔드의 경우에는 일반적으로 추후 유지보수를 위해 Application Server에서 많은 로그들을 쌓는데,(에러 또는 수행 결과 등)
특히 API 서버같은 경우에는 유저의 Request가(=트래픽) 많아질수록 엄청난 양의 로그들이 쌓이게 된다.
이를 그대로 방치해두면 로그는 고스란히 디스크에 쌓이게 되고, 결국 엄청난 디스크 용량을 차지해 서버가 다운될 수도 있기에, 이를 관리해주는 것은 굉장히 중요하다고 볼 수 있다.

로그가 계속 쌓이면 디스크 공간을 많이 차지하게 되어 서버의 용량이 부족해지고, 이는 서버의 성능을 저하시키고, 결국 서버 다운으로 이어질 수 있다.

따라서 일반적으로 crontab을 사용하여 로그들을 시간단위1로 분리하고, (AWS를 사용하는 서비스의 경우에는) 오래된 로그는 S3와 같은 저장소에 업로드한 뒤 디스크에서는 주기적으로 지워주는 방법을 사용하는 것으로 알고 있다.

일반적인 로그 관리 전략으로 로그 파일을 주기적으로 분리하고 저장소로 이동시키는 방법을 사용한다.

이 외에도 수많은 배치프로그램 및 스케줄러에서 crontab을 일반적으로 사용하고 있기 때문에 기본적인 내용에 대해서 공부해보려한다.

crontab 사용


“특정 시간에 특정 작업을 해야할 때 사용”

1
2
*      *      *      *      *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

순서대로 분-시간-일-월-요일 순 (요일에서 0과 7은 일요일. 1부터 월요일이고 6이 토요일.)

각 별 위치에 따라 주기를 다르게 설정 할 수 있다.
그리고 괄호 안의 숫자 범위 내로 별 대신 입력 할 수 있다.

crontab 사용 예제


매분 실행


1
2
# 매분 test.sh 실행
* * * * * /home/script/test.sh

특정 시간 실행


1
2
# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh

반복 실행


1
2
# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh

범위 실행


1
2
# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh

간격 실행


1
2
# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh

조금 복잡한 응용 예제


1
2
# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh

주기 입력 방법엔 * , - / 을 이용하는 방법이 있다.
위에서 보았듯이 각각의 특수기호가 하는 기능이 다르고 조합을 어떻게 하느냐에 따라 입맛대로 주기를 설정할 수 있다.

cron 사용 팁


한 줄에 하나의 명령만 쓰기


1
2
3
# 잘못된 예
* * * 5 5
/home/script/test.sh
1
2
# 잘된 예
* * * 5 5 /home/script/test.sh

주석 달기


위의 사용 예제와 같이 주석을 달아놓도록 하자.

1
2
3
4
# 주석 #
#--------------------#
# 이것은 주석입니다. #
#--------------------#

# 을 입력해서 그 뒤로 나오는 모든 문자를 주석 처리할 수 있다.

cron 로깅(logging)


크론탭을 사용해서 정기적으로 작업을 처리한 뒤 해당 처리 내역에 대해 로그를 남기고 싶을 수 있다.

1
* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1

위처럼 작성하면 매분마다 test.sh.log 파일이 갱신 되어 작업 내용이 어떻게 처리 되었는지 알 수 있다.
만약 2>&1 을 제거하면 쉘스크립트에서 표준 출력 내용만 나온다.2

그런데, 이게 너무 자주 실행 되고 또한 지속적으로 로깅이 되어야 해서 로그를 계속 남겨둬야 한다면 다음처럼 입력한다.

1
* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1

그러면 계속 로그가 누적이 되는 것을 확인 할 수 있다.
대신 로그가 과도하게 쌓이면 리눅스 퍼포먼스에 영향을 주므로 가끔씩 비워주거나 파일을 새로 만들어주는 센스가 필요하다.

반대로 로그는 필요 없는 크론을 위해선 다음처럼 입력한다.

1
* * * * * /home/script/test.sh > /dev/null 2>&1

: Reference


JDM’s Blog - 리눅스 크론탭 사용법

  1. 혹은 분단위가 될 수도 있을 것 같다. 대규모 트래픽을 감당하는 서버에서는 로그관리를 어떻게 해주고 있는지 다음에 꼭 찾아보고, 연결 링크를 달아두겠다. 

  2. 여기서 2>&1는 표준 오류를 표준 출력으로 리디렉션하는 것을 의미. 자세한 것은 리눅스 특수문자 정리 참고. 

This post is written by 서병범.

키보드 특수 기호 명칭

parseInt() vs valueOf(), Wrapper클래스