Development note/Linux

[CentOS] Linux에서 스케줄러(Crontab)를 사용하는 방법

v명월v 2020. 5. 22. 20:04

안녕하세요. 명월입니다.


이 글은 Linux에서 스케줄러(Crontab)를 사용하는 방법에 대한 글입니다.


Cron은 유닉스 시절에 사용되던 잡 스케줄러의 유틸리티의 이름입니다. 이 잡 스케줄러는 OS 내에서 일정 시각 혹은 시간 단위로 프로그램이나 스크립트를 실행하는 유틸리티입니다.

기본적으로 CentOS를 설치하면 자동으로 설치됩니다만 설치가 안 되어 있으면 yum으로 설치하면 됩니다.


저는 설치가 되어있습니다. 설치가 되어 있지 않으면 Installed가 아니고 Available라는 단어가 나오는데 yum -y install cronie로 설치 됩니다.


그럼 프로세스 확인으로 스케줄러가 실행 중인지 확인합니다.

Cron 데몬에 작업(Job)을 등록하기 위해서 예제 파일 하나 작성합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <chrono>
using namespace std;
// 실행 함수
int main() {
  // 현재 시간
  time_t timec = time(NULL);
  // 현재 시간
  struct tm* pLocal = localtime(&timec);
  // yyyy-mm-dd hh:mm:ss 포멧 설정
  char buffer[1024];
  sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d",
      pLocal->tm_year + 1900, pLocal->tm_mon + 1, pLocal->tm_mday,
      pLocal->tm_hour, pLocal->tm_min, pLocal->tm_sec);
  // 파일 스트림 생성
  wofstream ostream;
  // 파일 열기, 옵션은 기존에 있으면 아래에 내용 추가
  ostream.open("/home/work/new.txt", ios_base::app);
  //파일에 현재 날짜 시간 작성
  ostream << buffer << endl;
  // cout << buffer << endl;
  // 파일 스트림 닫기
  ostream.close();
  return 0;
}

이걸 실행하면 /home/work/new.txt가 생성되서 현재 시간의 텍스트가 추가됩니다.


Cron 데몬에 작업(Job)을 등록하겠습니다.

vim /etc/crontab

위 crantab파일을 편집기로 열면 아래와 같이 표시됩니다.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# 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

먼저 별 표시(*:Asterisk)가 다섯개가 있고, 그 다음에는 권한 유저, 그리고 실행 파일입니다.

이 별 표시는 먼저 Cron 문법인데 앞에서 부터 분 시 일 월 요일의 설정입니다. 별 표시를 하면 매분, 매시, 매일 매월, 매요일에 실행한다는 뜻이 됩니다. (Cron 문법은 아래에 자세히 설명)

제가 * * * * * * root /home/work/test를 작성하면 매분에 test 프로그램이 실행됩니다.

잡을 등록하면 별도로 cron을 재실행하지 않아도 바로 적용되어 정해진 시간에 실행이 됩니다.

1초의 갭이 발생하긴 했습니다만 거의 매분 실행되는 것을 확인할 수 있습니다.


하지만 특별히 cron을 재실행하려고 한다면 service로 재시작하면 됩니다.

# 시작
service crond start
# 중지
service crond stop
# 재시작
service crond restart

cron 문법

먼저 별 표시(*:Asterisk)는 매분, 매시간을 의미합니다.

* * * * * 가 되면 매분 실행됩니다.


특정한 시간을 정할 수도 있는데 이 때는 별 표시대신 숫자를 넣으면 됩니다.

0 12 * * * 가 되면 매일 12시에 실행됩니다.


특정한 시간을 복수로 설정할 수도 있습니다.

0 6,12,18 * * * 가 되면 매일 6시, 12시, 18시에 실행됩니다.


시간의 간격을 설정할 수 있습니다.

*/5 * * * * 가 되면 매5분마다 실행됩니다.


특정 시간을 설정할 수도 있습니다.

0-30 * * * * 가 되면 0부터 30분까지 매분 실행됩니다.


간격과 특정 시간을 혼합할 수도 있습니다.

0-30/5 * * * * 가 되면 0부터 30분까지 매5분 실행됩니다.


마지막은 별표시는 요일을 뜻합니다. 0또는 7은 일요일이고 1부터 월,화,수,목,금이 됩니다.

0 0 1 * 0 가 되면 매월 1일이 일요일일 경우만 실행됩니다.


특시기호 LW#이 있습니다.

L은 일, 요일에서 사용 가능한데 마지막 일과 마지막 요일을 뜻합니다.

* * L * * 가 되면 마지막날 매분 실행됩니다.

* * * * 6L 가 되면 월의 마지막주 토요일에 실행됩니다.


W는 일에서만 사용 가능한데 주중의 뜻입니다.

* * W * * 가 되면 주중(토일 제외) 매분 실행됩니다.

* * 1W * * 가 되면 1일이 주중이면 실행됩니다. 주말이면 실행 안됩니다.


#은 요일에서 사용 가능한데 몇번째 주인지를 뜻합니다.

* * * * 0#1 가 되면 첫번째 주 일요일에 실행됩니다.


정리하면 다음과 같습니다.

표현식 설명
* ALL의 의미로 매초, 매분, 매시간, 매일, 매월, 매요일, 매년
? 일 요일에서만 사용되는 조건 없음의 의미
/ 주기 반복의 의미
- 범위의 의미
L 일, 요일에서만 사용되는데 마지막날의 의미입니다.
W 일에서만 사용되는데 지정된 가장 가까운 평일을 찾습니다.
# 요일에서만 사용되는데 주#요일을 나타냅니다.

여기까지 Linux에서 스케줄러(Crontab)를 사용하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.