본문 바로가기
Linux/Linux Shell Command

cron

by 드로니뚜벅이 2024. 10. 30.

크론(cron) 명령어는 리눅스에서 특정 시간에 특정 작업을 하는 일종의 시간 기반의 작업 스케줄러 데몬입니다. 반복적으로 특정 명령어나 작업을 자동으로 실행하는 목적으로 많이 사용합니다.

크론탭(crontab)은 여러 작업을 시간별로 작성해 놓은 테이블입니다.

 

crontab을 통해 특정 시간에 특정 작업을 하고, 반복된 시간에 반복된 작업을 하고자 할 때 사용할 수 있습니다.

 

Ubuntu 설치 시 기본적으로 같이 설치되는데 혹시 설치되어 있지 않다면 아래 명령으로 설치해 줍니다.

$ sudo apt update -y
$ sudo apt install -y cron

 

크론탭(crontab) 사용법

crontab -e : 크론탭 편집 (관리자 권한이 없는 경우)
crontab -l : 크론탭 작업 내용 확인
crontabl -r : 크론탭 삭제

 

관리자 권한이 있다면 /etc/crontab 파일에 직접 스케쥴 작업 항목을 편집할 수 있습니다. 

$ sudo vi /etc/crontab
# /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
# You can also override PATH, but by default, newer versions inherit it from the environment
#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,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

 

크론탭 주기 사용

* * * * * {실행 명령}
분(0~59) 시(0~23) 일(0~31) 월(0~12) 요일(0~6)
 # ┌───────────── min (0 - 59)
 # │ ┌────────────── hour (0 - 23)
 # │ │ ┌─────────────── day of month (1 - 31)
 # │ │ │ ┌──────────────── month (1 - 12)
 # │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
 # │ │ │ │ │
 # │ │ │ │ │
 # * * * * *  command to execute

한 줄에는 하나의 명령어만 입력해야 합니다.

 

편집 시 사용가능한 특수문자

특수문자 설명
* 모든 값을 뜻합니다.  
? 특정한 값이 없음을 뜻합니다.  
- 범위를 지정합니다. 1일부터 3일: * * 1-3 * *
, 특별한 값일 때만 동작합니다. 20분,40분: 20,40 * * * *
/ 시작시간/단위 0분부터 매 5분: 0/5 * * * *
L 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)  
W 가장 가까운 평일  
# 몇째주의 무슨 요일 표현 2번째주 수요일: 3#2

 

 

사용 패턴:

분 단위

매 분마다 실행

    * * * * * {실행 명령}

    ex) * * * * * /home/oottagiya/timer.sh

15분마다 실행

    */15 * * * * {실행 명령}

매일 매시간 0분, 20분, 40분에 실행

    0,20,40 * * * * {실행 명령}

 

시간 단위

매 시간(정각)마다 실행

    0 */1 * * * {실행 명령}

매일 오후 2시 정각에 실행

    0 14 * * * {실행 명령}

매주 금요일 12시 정오에 실행 (일요일: 0, 월요일: 1, ..., 금요일: 5, 토요일: 6) 

    0 12 * * 5 {실행 명령}

매 6시간마다(00:30, 06:30, 12:30, 18:30) 실행

    30 */6 * * * {실행 명령}

1시부터 매 6시간마다(01:30, 07:30, 13:30, 19:30) 실행

    30 1-23/6 * * * {실행 명령}

 

일 단위

매달 5일 자정에 실행

    0 0 5 * * {실행 명령}

 

요일 단위

평일(월요일~금요일) 06:00에 실행

    0 6 * * 1-5 {실행 명령}

 

복합 단위

1일에서 3일까지 오후 1시, 3시, 5시에 매 10분마다 실행

    */10 13,15,17 1-3 * * {실행 명령}

 

서비스 실행 명령

crontab 시작

$ sudo service cron start

 

crontab 중지

$ sudo service cron stop

 

crontab 상태 확인

$ sudo service cron status

 

crontab 재시작

$ service cron restart  # or service crond restart

 

 

주석 사용

# ===================================
# CRONTAB 편집 시 주석을 달 수 있어요.
# ===================================

 

로그 남기기

# 분단위 로그 저장 (최종 로그만 저장됩니다. 1분마다 갱신됨)

* * * * * /home/oottagiya/today-todos.sh > /home/oottagiya/today-todos.sh.log 2>&1

# 누적해서 로그 저장 (파일 크기가 커질 수 있기 때문에 주기적으로 삭제해 줘야 합니다)

* * * * * /home/oottagiya/today-todos.sh >> /home/oottagiya/today-todos.sh.log 2>&1

59 23 * * * print > /home/oottagiya/today-todos.sh.log