본문 바로가기

별걸다하는 IT/리눅스 유닉스

[Linux]작업 예약 스케줄러(크론Cron)파일,자동 백업 명령 & 관련 문제

리눅스 완전 정복 : 리눅스 목차

 

 

cron이란?

특정한 시간에 또는 특정 시간 마다 어떤 작업을 자동으로 수행하게 해주고 싶을 때 사용하는 명령어가 cron입니다.

cron은 특정한 시간에 특정한 작업을 수행하게 해주는 스케줄링 역할을 합니다.

리눅스에만 있는 개념은 당연히 아니예요~ 

 

cron 시스템에는 시스템에서 기본적으로 사용하는 cron설정이 있으며, 이를 시스템크론이라 합니다.

또 root나 일반 사용자가 자신의 cron설정을 직접하여 사용하는 사용자크론이 있습니다.

 

cron은 왜 사용해?

cron이 왜 필요한지 좀 더 자세한 상황예시가 있었으면 좋겠다고요?!

여러분이 시스템 사용이 가장 적은 새벽 5시에 백업을 해야 한다면, 하루 이틀쯤이라면 퇴근을 하지 않고 기다릴 수 있겠지만, 매일 그래야 한다면 어떻게 하겠어요? 심지어 야근수당까지 안나온다면... 끔찍하죠 

이런 경우 주기적으로 반복되는 일을 자동으로 실행할 수 있도록 시스템 작업을 예약해줘야겠죠 -> CRON! 

 

이 외에도 하루 한 차례 특정 서버에 접속해서 데이터를 받아와야 한다던가.. 

정기적인 메일을 발송한다던가.. 

보안 취약점 검사를 매일 반복적으로 수행시킨다던가

여러가지 상황에서 쓰일 수 있겠죠!

 

cron은 보안쪽에서도 매우 중요한 개념이예요. 보안 취약점 검사를 매일 수행시키기 위해서도 물론 있지만,

과거 공격자들이 특정 서버에 침입해 자신의 악성코드를 실행하는 명령을 crontab에 설정해서 악성코드를 실행시킨 적이 있기 때문이죠. 그래서 정보보안기사에도 자주 출제가 되요.

 

Crontab과 cron과 관련된 몇 가지 파일들

1. crontab

cron작업을 설정하는 파일을 crontab파일이라고 합니다. 

cron프로세스는 /etc/crontab 파일에 설정된 것을 읽어서 작업을 수행해요

crontab 파일은 OS별로 각각 다른 위치에 저장이 됩니다. 

 

일반적으로 BSD계열의 리눅스는 /var/spool/cron/ID

솔라리스 계열은 /var/spool/cron/crontabs/ID에 위치하고 있어요 

/etc/crontab의 형식은 다음과 같이 총 7개의 필드로 구성되어 있습니다.

 

★★★★★ 기억하기 
분 - 시 - 일 - 월(month기준) - 요일 
- 사용자  - 실행명령 (일단 기억해두기)

2. cron

그 다음 파일들~

/usr/sbin/cron --> 크론 데몬 파일입니다.

 

1
2
root@server:~# find /etc -name crontab
/etc/crontab
cs

리눅스는 /etc 디렉터리에 crontab 파일이 저장되어 있는 것을 확인할 수 있습니다.

crontab 파일을 한 번 들여다보면

 

# m h dom mon dow user command 

사진에 보시면 이렇게 주석으로 crontab 파일에 저장되어 있는데 이게 

분 시 일 월 요일 사용자 실행명령 즉 이런 형식을 갖는다는 설명이 주석으로 쓰여있어요.

 

그 밑에 라인 보면 

17 * * * * ~

25 6 * * * root test -x /usr/sbin/anacron ~ 

이런 줄들을 볼 수 있는데 여기서 *는 매월, 매일 할 때 그 every를 뜻 해요. 3번째 칸이 *이면 매일, 4번째 칸이 *이면 매월이겠죠?

 

3. /usr/sbin/anacron 

사진에 보이는 이 파일은 크론과 같이 동작하는 프로그램으로 서버가 일정 시간 중지되었을 때에도 작업이 실행되는 것을 보장하기 위해 사용하는 도구입니다.

 

그리고 사진을 잘 보면 

4. /etc/cron.daily/etc/cron.weekly 그리고 /etc/cron.monthly 파일을 볼 수 있는데 (물론hourly도 마찬가지)

이 파일들은 시스템크론설정디렉터리예요. cron은 주기적으로 실행할 내용을 시스템크론설정디렉터리에 넣어 놓고 작동하는데

해당 디렉터리 구조는 이와 같습니다.

5. /var/log/cron 크론 실행내용이 기록되는 로그파일 입니다.

6. /etc/cron.allow, etc/cron.deny  크론 접근을 허용할 ID, 크론 접근을 허용하지 않을 ID 등을 설정할 수 있다.

 

cron동작 방식, cron 실행 흐름

크론이 뭔지, 크론이 어떤 역할을 하는지, 관련파일은 뭐뭐가 있는지 알아봤으니

cron이 어떻게 동작하는지 좀 더 자세히 알아봅시다.

 

cron파일이 데몬이기 때문에 부팅시 백그라운드로 실행됩니다.

현재 프로세스 확인해보니 cron 데몬 프로세스가 있네요. (백그라운드에서 실행된 것을 확인 할 수 있어요)

 

The cron daemon uses crontab files to specifiy what tasks to run and when.

cron동작방식을 보면 cron 데몬 (crond)가 crontab을 참조하고 있어요 

cron데몬은 어떤 task를 언제 어떻게 수행할지를 crontab에서 찾아서 실행합니다.

cron데몬은 시스템 스케줄러 정보뿐만 아니라 각각 사용자가 설정한 작업 예약 정보도 crontab에서 다 확인할거예요.

 

crontab설정형식과 cron 지정, 등록하기.

드디어 ~~~ cron을 만들어볼거예요

그 전에 형식에 맞게 생성해주기 위해 crontab 형식을 먼저 살펴봅시다 (사실 위에서 아주 초큼 다루면서 기억해두라고 했는데..!)

 

먼저 crontab 파일의 7필드 

# m h dom mon dow user command 

 필드

 설정 값 및 내용 

 m

 분(minute)을 나타내고, 0~59로 설정한다. 

 h

 시(hour)을 나타내고 0~23으로 설정한다. 

 dom 

 날(day of month)를 나타내고, 1~31로 설정한다. 

 mon 

 월(month) 을 나타내고 1~12로 설정한다. 

 dow

 요일(day of week)을 나타내고 0~7로 설장한다. 0과 7은 일요일에 해당하고 

 1은 월요일, 2는 화요일,,,,6은 토요일이다. 직접 글씨 써도 되네 ㅇ 

 user

 user-name 사용자 이름을 명기한다. 

 command

 실행할 명령어를 기입한다. 명령어 앞에 사용자 이름을 명기해도 된다. 

참고로 각 필드는 위 표에 명기된 설정 값 이외에 '*', '-', ',', '/'를 사용할 수 있어요.

 

'*' : 각 필드 자리에 *기호가 오면 해당 필드의 모든 값을 의미합니다.

예를 들어 두 번째 필드에 *가 오면 매시, 3번째 필드는 매일, 4번째 필드의 *는 매월..

'-' : 그 사이의 모든 값 (정규식에서 많이 봐서 익숙할거예요)

세 번째 필드에 '1-5'면 1일,2일,3일,..,5일

',' : 지정한 모든 값을 의미 (불규칙적인 값 지정시 주로 사용합니다) 

2 번쨰 필드에서 "1,3,4"는 1시 3시 4시를 의미.

'/' : '/'는 연결된 설정 값 범위에서 특정 주기로 나눌 때 사용합니다.

 

시스템 운영에 필요한 작업은 root 권한으로 /etc/crontab에 등록해서 주기적으로 수행할 수 있고 

사용자는 crontab이라는 명령을 수행해서 등록할 수 있어요

 

$ crontab [option] 파일명

사용자가 주기적인 작업을 등록하기 위해 사용하는 명령어 

(실행하면 기본 편집기인 vi가 실행됩니다)

 

옵션

 옵션

 내용 

 -l 

 crontab에 설정된 내용을 출력한다. (조회)

 -e

 crontab의 내용을 작성하거나 수정한다. (설정)

 -r 

 crontab의 내용을 삭제한다 (삭제)

 -u 

 root 사용자가 특정 사용자의 crontab 파일을 다룰 때 사용한다. 

-e옵션으로 편집하고 저장 한 후 그냥 빠져나오면 크론설정이 끝이다.ㅎㅎ 

 

~$ crontab -e

개별사용자의 cron 설정 방법 --> 크론탭을 요렇게 등록하고

~$ crontab -l

개별사용자의 cron 확인 방법  -> 이 명령어로 확인해주면 됌

~$ crontab -r

개별사용자의 cron 삭제 방법 

# crontab -u 사용자명 -e
root의 일반 사용자 cron 설정 방법
# crontab -e -u posein (posein 사용자의 crontab 내용을 작성하거나 수정한다~)
# crontab -u 사용자명 -l
root의 일반 사용자 cron 설정 확인 방법
# crontab -u 사용자명 -r
root의 일반 사용자 cron 설정 삭제 방법
 

유용한 cron 설정 예시 

1.  매일 2.am에 백업하기 

-> 0 2 * * * /bin/sh backup.sh  (참고로 추후 데이터베이스 파트에서 실제로 cron을 이용해서 자동 백업을 진행해볼거예요)

2. 하루에 두번 script.sh 수행

-> 0 5, 17 * * * /scripts/script.sh

3. 매분 수행 

-> * * * * * /scripts/script.sh

4. 매 10분마다 monitor 스크립트 실행

-> */10 * * * * /scripts/monitor.sh

5. 1월부터 12월까지 2개월마다 1일날 오전 4시 10분에 /etc/check.sh라는 스크립트 실행

-> 10 4 1 1-12/2 * /etc/check.sh

6. 금요일하고 일요일 5시에만 스크립트 수행되게 

-> 0 17 * * sun,fri /script/script.sh

7. 매달 첫 번째 일요일에만 시행되게

-> 0 2 * * sun [$(date + %d) -le 07] && /script/scripnt.sh

등등.... 더 많은 명령어는 여기를 참조하세요 (사실 굳이 여기 아니더라도 cron 예시 검색하면 자료가 쏟아져나오더라고요 ㅎㅎ)

 

문제

리눅스마스터 2급 2016년 1회 기출

다음 중 cron을 통해 매년 1월부터 10월까지 두 달 주기로 1일날 오전 7시 정각에 /bin/vipcheck.sh라는 스크립트를 실행하는 것으로 알맞은 것은?

1. * 0 7 1 1-10/2 root /bin/vipcheck.sh

2. 0 7 1 1-10/2 * /bin/vipcheck.sh

3. 1-10/2 1 7 0 * root /bin/vipcheck.sh

4. 1-10/2 7 0 1 * /bin/vipcheck.sh

답 : 2

 

리눅스마스터 2급 2017년 1회 기출

다음과 같이 설정된 crontab 파일에 대한 설명으로 알맞은 것은?

----------------------------------------------------------------------------------

0 1 * * 1-6 ihd /usr/bin/dcs.sh

----------------------------------------------------------------------------------

1. 월-토요일마다 오전 1시 정각에 /usr/bin/dcs.sh를 실행한다.

2. 1월-6월 사이 오전 1시 정각에 /usr/bin/dcs.sh를 실행한다.

3. 월-토요일마다 매시간 1분 0초에 /usr/bin/dcs.sh를 실행한다.

4. 1월-6월 사이 매시간 1분 0초에 /usr/bin/dcs.sh를 실행한다.

답: 1

 

도움이 됐다면 공감 꾸욱~

ㅇㅇㄹㅇㄹㅇㄹ