[CentOS] Linux에서 스케줄러(Crontab)를 사용하는 방법
안녕하세요. 명월입니다.
이 글은 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)를 사용하는 방법에 대한 글이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.