리눅스 - 리눅스 작업 예약 스케쥴러 cron, crond, crontab

정현우·2021년 12월 9일
4

Linux Basic to Advanced

목록 보기
7/16

작업 예약 스케쥴러

소프트웨어 유틸리티 cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.

cron

정의

  • cron은 리눅스에만 있는 개념이 아니라, 주기적인 잡 스케쥴 실행을 위한 S/W 유틸리티이다.

  • cron은 셸 명령어들이 주어진 일정에 주기적으로 실행하도록 규정해놓은 crontab (cron table) 파일에 의해 구동된다. crontab 파일들은 잡 목록 및 cron 데몬에 대한 다른 명령들이 보관된 위치에 저장되어 있다. 사용자들은 자신들만의 개개의 crontab 파일들을 가질 수 있으며, 가끔은 /etc 또는 /etc의 하위 디렉터리에 시스템 관리자들만이 편집할 수 있는, 시스템 전반에 영향을 미치는 crontab 파일이 존재하는 경우도 있다.

  • "사용자들"이라 함은 리눅스 운영체제 계열의 유저, 사용자 계정을 의미한다. 사용자에 대한 내용은 관리부터 활용까지 해당 시리즈에서 정리할 예정이다.

사용하는 경우

  • batch 성격을 가지고 있는 작업의 경우.

    • Batch Processing란 일괄 처리라고도 하는 과정으로서 실시간으로 요청에 의해서 처리되는 방식이 아닌 일괄적으로 한꺼번에 대량의 프로세스를 처리하는 방식이다.
    • 대량의 데이터, 특정 시간에 프로그램, 일괄적 처리 가 현업에서 말하는 "Batch"의 특성이다.
  • 주로 특정 로그 관리, 보안 취약점 테스트, 특정 시간에 특정 액션을 취해야 할 때 많이 사용 된다.

crond

  • cron은 유틸리티 (S/W 파일)이다. 그렇기 때문에 실행되어야 cron cli사용이 가능하다.
$ ps -ef | grep cron
root       1227      1  0 Feb10 ?        00:00:37 /usr/sbin/cron -f
  • 위와 같이 찾아보면, cron이 -f 옵션으로 데몬 형태로 돌아가는 것을 볼 수 있다. -> 부팅시 백그라운드로 실행된다. 이 데몬 형태 cron을 crond라고 한다.

  • 시스템 크론데몬인 crond를 실행, 중지, 재시작하려면 /etc/rc.d/init.d/crond스크립트를 이용한다. (/etc/rc.d 하위에서 심볼링 링크로 이어져 있다. -> 리눅스의 "데몬"에 대해서 알아야 한다.) -> init.d는 리눅스의 시작 데몬 위치이다.

cron 동작 방식

  1. 시스템 ON (서버 부팅)
  2. Init 데몬
  3. crond 데몬 실행
  4. /etc/crontab 파일 읽어들임
    a. 경로를 잘 못찾겠다면 (sudo) find / -name crontab 한 번 해보자.
  5. cron.hourly -> cron.daily -> cron.weekly -> cron.monthly 로 내용들 수행한다.
  6. /var/spool/cron 디렉토리에 있는 파일들을 읽어 들인다. -> 각 사용자들의 개별 cron 설정 파일이다.
  7. cron에 의해 수행되지 못한 작업은 anacron에 의해 수행을 시도 한다.
  8. cron 로그 파일에 실행을 기록한다.
  • 위 와 같다. (4)번 항목의 경로에 대해서는 리눅스 계열 마다 다를 수 있다.

  • 일반적으로 BSD계열의 리눅스는 /var/spool/cron/ID, 솔라리스 계열은 /var/spool/cron/crontabs/ID에 위치하고 있다. 조금 더 자세한 사항은 crontab을 보면서 다시 한 번 살펴보자!

  • 이 글은 데비안 계열, ubuntu에 초점이 좀 맞춰져 있다. 필자가 제일 편한게 우분투라서..


crontab

  • cron 유틸리티가 작업을 설정하는 파일을 crontab파일 이라고 한다. cron을 사용하려면 crontab에 스케쥴 파일을 등록해야 한다는 것이다. 해당 스케쥴을 우리는 crontab 명령어를 통해 만들 수 있다.

  • sudo vi /etc/crontab으로 까보자.

사용 방법

crontab -help 으로 가능한 명령어 리스트를 살펴보자!

$ crontab -help
crontab: invalid option -- 'h'
crontab: usage error: unrecognized option
usage:	crontab [-u user] file
	crontab [ -u user ] [ -i ] { -e | -l | -r }
		(default operation is replace, per 1003.2)
	-e	(edit user's crontab)
	-l	(list user's crontab)
	-r	(delete user's crontab)
	-i	(prompt before deleting user's crontab)
  1. crontab -e : 크론탭 설정. 어떤 에디터 (입력 형태)로 crontab을 작성할지 선택하면 된다. 여기서 크론탭 명령어를 입력 후 :wq 를 통해 크론탭을 갱신시킬 수 있다. -> nano같은 경우에는 물론 ^X 와 같이 상이할 수 있다.
$ crontab -e
no crontab for ubuntu - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]:
  1. crontab -l : 명령어를 실행하는 해당 유저의 crontab 리스트를 보여준다.

  2. crontab -r : 명령어를 실행하는 해당 유저의 crontab 을 삭제한다.

  3. 크론탭 하나 등록해보자!
    a. 만약 crontab -e 에서 nano로 해서 불편하다면? 정확한 이해가 없는 상태에서 nano를 쓰면 crontab 파일을 제 위치에 저장을 못 할 수 도 있다.
    b. 해당 유저의 /etc/profile 맨 아래줄에 exprot VISUAL=vim 을 추가하고 재 로그인을 해보자!
    c. (b)가 싫으면 nano자체 심볼릭 링크를 vim으로 바꾸는 방법이 있다.

$cd /bin
$mv nano nano_must_die # 디렉토리명은 그냥 마음대로, 즉 nano를 옮겨버리는 것 ㅋ
$ln -s /usr/bin/vim nano
  • crontab -e를 실행해 * * * * * ls -al 입력 해 보자. -> 1분만 기다려 보면 아무것도 안했는데 ls -al 명령어가 실행되는 것을 볼 수 있다. -> 만약 안되는 것 같다? cat /var/log/syslog | grep CRON를 통해 syslog에서 cron 관련 Log를 살펴보자!
  1. crontab -u : 루트 사용자가 다른 사용자의 crontab을 관리할 때 사용한다.
  • crontab -u 사용자명 -e: root의 일반 사용자 cron 설정 방법
  • crontab -u 사용자명 -l, crontab -u 사용자명 -r 로 사용 가능

주기 결정

  • 각 별 위치에 따라 주기를 다르게 설정 할 수 있다. 순서대로 분-시간-일-월-요일 순서며 괄호 안의 숫자 범위 내로 별 대신 입력 할 수 있다! 요일에서 0과 7은 일요일이고 1부터 월요일, 6이 토요일이다.

조금 더 자세하게, m h dom mon dow user command

  1. m: 분(minute)을 나타내고, 0~59로 설정한다. 
  2. h: 시(hour)을 나타내고 0~23으로 설정한다. 
  3. dom: 날(day of month)를 나타내고, 1~31로 설정한다.  
  4. mon: 월(month) 을 나타내고 1~12로 설정한다.
  5. dow: 요일(day of week)을 나타내고 0~7로 설장한다.
  6. user: user-name 사용자 이름을 명기한다. - 옵션
  7. command: 실행할 명령어를 기입한다. 명령어 앞에 사용자 이름을 명기해도 된다.

예시 리스트

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

# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh >> /home/test_sh_cron.log
# >> 명령어를 활용해 실행 Output을 log파일 형태로 append하게 만들 수 있다.

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

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

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

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

# 1월부터 12월까지 2개월마다 1일날 오전 4시 10분에 test.sh 를 실행
10 4 1 1-12/2 * /home/script/test.sh
  • *: 각 필드 자리에 별기호가 오면 해당 필드의 모든 값을 의미한다.
  • - : 그 사이의 모든 값 (정규식)
  • , : 지정한 모든 값을 의미한다. 불규칙적인 값 지정시 주로 사용한다.
  • / : 연결된 설정 값 범위에서 특정 주기로 나눌 때 사용

크론탭 백업

  • 혹시라도 crontab -r 를 쓰거나 실수로 crontab 디렉토리를 날려버릴일을 대비해 백업을 하자!
crontab -l > /home/bak/crontab_bak.txt

# 이걸 그냥 자동화 해버리는 것!
# 매일 오후 11시 50분에 크론탭을 백업
50 23 * * * crontab -l > /home/bak/crontab_bak.txt

관계 있는 디렉토리

/usr/sbin/anacron

  • 서버가 일정 시간 중지되었을 때에도 작업이 실행되는 것을 보장하기 위해 사용하는 도구이다.

  • anacron은 정해진 시간을 주기로 작업을 수행하는 것이 아니라, 해당 작업이 정해진 시간 내에 실행된 적이 있는지를 점검한 후 만약 정해진 시간 내에 수행한적이 없다면, 해당 작업을 여유를 두고 실행한다.

  • Depth 있는 설명

/etc/cron.daily, weekly, monthly, hourly

  • 시스템크론 설정 디렉토리 -> cron은 주기적으로 실행할 내용을 시스템 크론 설정 디렉토리에 넣어 놓고 작동한다.

  • 이름 따라 매일, 매주, 매달, 매시 마다 수행 될 내용들을 담고 있다.

/var/log/cron

  • 크론 실행 내역이 기록되는 로그 파일이다.

/etc/cron.allow, /etc/cron.deny

  • 크론 접근을 허용할 ID, 크론 접근을 허용하지 않을 ID등을 설정할 수 있다.

추가 참고 자료

  • 크론탭 사용시 체크해볼 주의 사항

  • 크론탭을 사용하면서 가장 많이 일어나는 실수는 아래 4가지 정도인 것 같다. (스스로 에게 물어봤을때 ㅎ.. 무려 4가지나 된다)

    1. 퍼미션(권한),
    2. output 처리(log 관리)
    3. 시간 설정 실수 -> 특히 슬래시(/)를 사용할때 ㅋ
    4. / 크론탭 실수로 Delete 정도가 아닐까 싶다.
  • 리눅스 책 발췌 - cron tab

profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글