[RHEL 공통] crontab을 활용한 스크립트 수행
본문 바로가기
IT 이야기/Linux

[RHEL 공통] crontab을 활용한 스크립트 수행

by 찬찬이 아빠 2021. 2. 19.
반응형
  1. cron 동작과 설정 파일

정기적인 집계 처리나 서버 네트워크 감시 같은 셸 스크립트를 자동으로 실행하고 싶은 경우가 많습니다. cron은 백업과 같이 주기적으로 실행하는 명령들을 정해진 시간에 자동으로 실행해 주는 도구로써 다음과 같이 서비스를 실행합니다.

# /etc/init.d/crond start
Starting crond.......... [OK]

 

cron은 cron 데몬(리뉵스는 crond, FreeBSD는 cron)이 설정 파일 crontab에 적힌 대로 명령어를 정기적으로 실행하는 방식으로 동작합니다.

 

cron의 기본 설정 파일은 레드햇의 경우 /etc/crontab에 있습니다. crontab은 주기적으로 지정한 시간에 지정한 작업을 하도록 설정합니다. 이에 반해 at 명령은 지정한 시간에 한번만 시행됩니다.

# cat /etc/crontab
# 환경 변수 설정
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/


# 실행할 명령어 정의
# 분 시 일 월 요일	실행 사용자	실행 명령어
01 * * * * 	root run-parts 	/etc/cron.hourly
02 4 * * * 	root run-parts 	/etc/cron.daily
22 4 * * 0 	root run-parts 	/etc/cron.weekly
42 4 1 * * 	root run-parts 	/etc/cron.monthly

0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

 

여기서 '실행할 명령어 정의'는 앞에서 다섯 필드인데 자동 실행하고 싶은 시간 설정을 지정합니다. cron 스케쥴에 등록하는 시간 지정에 대한 각 항목은 다음과 같습니다.

구분 설정값
분(Minutes) 0-59
시(Hour) 0-23
일(Day of month) 1-31
월(Month) 1-12로 숫자를 표기하거나 Jan, Feb, Mar 등으로 표기
요일(Day of week) 0-6(0은 일요일)로 숫자 표기하거나 Sun, Mon, Tue 등으로 표기

 

crontab 필드에 사용 가능한 값들은 아래와 같습니다.

표기 의미
* 각각의 컬럼에서 지정 가능한 첫 값에서 끝 값까지. 즉, '전부'를 뜻함
숫자 범위 예를 들어 시간 필드에 8-11을 지정하면 8시, 9시, 10시, 11시에 실행
목록 시간 필드에 쉼표로 나뉜 '1,2,5,9'르르 지정하면, 1시, 2시, 5시, 9시에 실행
목록과 범위는 조합가능
간격값 '/숫자'르르 넣으면 그 숫자 간격으로 실행
예를 들어 분 필드에 '*/5'를 지정하면 5분마다 실행

 

1. 스크립트 파일 위치 시키기 및 권한 설정
/home/계정명/스크립트 파일명.sh

# chmod 750 스크립트 파일명.sh


2. crontab 설정

# crontab -e
*/10 * * * * /스크립트 파일명.sh

분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-7)
10분단위 : */10
요일 : 일요일(0)부터 시작

 

 

 

  2. 사용자별 crontab 파일

/etc/crontab은 시스템 전체 설정 파일이므로 root 사용자만 편집할 수 있습니다. 사용자별로 cron을 설정하려면 crontab 명령어에 편집을 의미하는 -e 옵션을 써서 "crontab -e"로 실행합니다. 이러면 텍스트 에디터가 실행되어서 편집 뒤 저장하고 종료하면 사용자별 cron을 설정할 수 있습니다.

 

한편 crontab -e를 실행할 때는 환경 변수 EDITOR에 설정한 에디터를 사용합니다. 사용자별 crontab 파일의 실제 파일은 리눅스에서는 /var/spool/cron/사용자명, FreeBSD에서는 /var/cron/tabs/사용자명이 됩니다. 작성한 crontab 파일 내용은 crontab -l로 실행하면 확인할 수 있습니다.

$ crontab -l
TMPDIR=/var/tmp

0 1 * * * /usr/bin/command

 

사용자별 crontab 파일을 다룰 때 주의해야 하는 것은 crontab 명령어 삭제를 의미하는 -r 옵션입니다. crontab -r 옵션은 실행하면 경고나 아무런 표시 없이 즉시 crontab 파일을 삭제합니다.

$ crontab -r
$ crontab -l
no crontab for user1

 

crontab -e로 crontab 파일을 변경하려다가 crontab -r을 실행해서 삭제하는 실수를 종종하게 됩니다. 이런 실수를 방지하기 위해 우선 crontab -l로 지금 내용을 파일에 출력하고 그 파일을 변경한 다음 crontab <파일명>으로 반영하고 crontab -e는 절대로 사용하지 않는 방법도 있습니다. crontab 명령어는 인수로 파일을 지정하면 그 파일 내용으로 crontab을 등록합니다.

$ crontab -l > ~/crontab
$ vim ~/crontab		(파일 수정)
$ crontab ~/crontab

 

이런 방법을 사용할 때는 수정할 파일의 버전을 서브 버전이나 Git 같은 형상 관리 도구로 관리하는 것이 좋습니다.

 

 

  3. cron 매뉴얼

설정 파일 crontab과 편집하기 위한 crontab 명령어는 서로 다릅니다. 같은 이름이라서 man 명령어로 매뉴얼을 참조할 때 혼란이 생기기 쉽습니다. 매뉴얼 종류는 다음과 같습니다.

매뉴얼 명령어 매뉴얼 대상
man 1 crontab 사용자별 crontab 파일을 관리하는 crontab 명령어
man 5 crontab crontab 작동을 위한 crrontab 정의 파일 설명
man cron 상주해서 cron을 실행하는 cron 데몬 설명

 

 

  4. cron 환경변수

cron에서 실행되는 스크립트는 명령행에서 실행할 때와 환경 변수나 현재 디렉터리가 다를 수 있습니다. 구체적으로 cron에서 실행할 때는 bash더라도 ~/.bashrc를 읽지 않습니다. 또한 현재 디렉터리는 실행 사용자의 홈 디렉터리가 됩니다.

 

이런 특성을 이해해두지 않으면 명령행에서 ./script.sh로 수동 실행하면 정상적으로 동작했는데 cron에 등록해서 실행하면 에러가 발생하는 문제가 생깁니다. cron에 등록하기 전에 다음 항목을 확인하고 스크립트를 작성하기 바랍니다.

1. 현재 디렉터리가 어디든지 문제없이 동작하는가?

2. 환경 변수 PATH 값을 확인했는가?
 -> cron에는 예를 들어 /usr/local/bin 경로가 지정되지 않는 것이 보통입니다. 스크립트를 실행하기 전에 crontab 파일에서 환경 변수 PATH에 필요한 경로를 추가하거나 셸 스크립트 내부에서 명령어를 완전 경로로 작성하기 바랍니다.

 

반응형

댓글