1. 개념

Cron/Crontab은 원하는 시간에 명령(프로그램)을 시키기 위한 데몬이다.
서버는 늘 깨어있다는 것을 이용한 최대한의 활용법이 될 수 있다.

    - 내가 새벽 3시에 서버에 특정 작업을 해줘야하는데 그 때 깨어있을 수 있는가?
    - 또는 30분 간격으로 HDD의 사용량을 운영자에게 알리도록 해야한다면?
    - 매월 초에 자료를 백업 받고 싶다면?

바로 이럴 때 cron은 최고의 해결책을 제시한다.
cron은 항상 지정한 시간이 되었는지 확인을 하여 해당 명령어을 실행하는 것이다.

시스템의 최적화의 기법은 일정 시간 단위로 최대한의 성능을 발휘하도록 도와주는 것이다.
즉, 주기적으로 운영 중에 만들어진 필요하지 않는 임시 파일을 정리하거나, 운영체제 운영에 필요한 데이터를 갱신하는 등의
작업을 통해 리눅스가 최적의 상태를 유지할 수 있게 할 수 있다

 

2. 사전 확인 사항

1)  Cent OS에서 crontab이 없을 경우 (PGM 설치)

# crontab -l
-bash: crontab: command not found

 

# sudo yum install cronie
Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile
* base: mirror.web-ster.com
* updates: mirror.stanford.edu
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package cronie.x86_64 0:1.4.4-12.el6 will be installed
--> Processing Dependency: dailyjobs for package: cronie-1.4.4-12.el6.x86_64
--> Running transaction check
---> Package cronie-anacron.x86_64 0:1.4.4-12.el6 will be installed
--> Processing Dependency: crontabs for package: cronie-anacron-1.4.4-12.el6.x86_64
--> Running transaction check
---> Package crontabs.noarch 0:1.10-33.el6 will be installed
--> Finished Dependency Resolution
                                       
Dependencies Resolved
================================================================================
Package                        Arch      Version           Repository     Size
================================================================================
Installing:                            
cronie                         x86_64    1.4.4-12.el6      base           73 k
Installing for dependencies:           
cronie-anacron                 x86_64    1.4.4-12.el6      base           30 k
crontabs                       noarch    1.10-33.el6       base           10 k
                                       
Transaction Summary                    
==========================================================
Install       3 Package(s)              
                                                
Total download size: 114 k                      
Installed size: 220 k                           
Is this ok [y/N]: y                             
Downloading Packages:                           
(1/3): cronie-1.4.4-12.el6.x86_64.rpm                         |  73 kB     00:00
(2/3): cronie-anacron-1.4.4-12.el6.x86_64.rpm                 |  30 kB     00:00
(3/3): crontabs-1.10-33.el6.noarch.rpm                        |  10 kB     00:00
--------------------------------------------------------------------------------
Total                                                336 kB/s | 114 kB     00:00
Running rpm_check_debug                         
Running Transaction Test                        
Transaction Test Succeeded                      
Running Transaction                             
  Installing : cronie-1.4.4-12.el6.x86_64                   1/3
  Installing : crontabs-1.10-33.el6.noarch                  2/3
  Installing : cronie-anacron-1.4.4-12.el6.x86_64                           3/3
  Verifying  : crontabs-1.10-33.el6.noarch                                  1/3
  Verifying  : cronie-anacron-1.4.4-12.el6.x86_64                           2/3
  Verifying  : cronie-1.4.4-12.el6.x86_64                                   3/3
                                                
Installed:                                      
  cronie.x86_64 0:1.4.4-12.el6                  
                                                
Dependency Installed:                           
  cronie-anacron.x86_64 0:1.4.4-12.el6            crontabs.noarch 0:1.10-33.el6

Complete!

 출처 : http://tecadmin.net/install-crontab-in-linux/#

 

* 설치 방법정리

1) Crontab 설치(CentOS)
* cron 설치
# sudo yum update -y
# sudo yum install -y cronie
* cron 시작
# sudo systemctl start crond
* cron systemctl 활성화
# sudo systemctl enable crond
*cron systemctl 등록 확인
# sudo systemctl list-unit-files | grep crond

2) Crontab 설치(Ubuntu)
* cron 설치
# sudo apt update -y
# sudo apt install -y cron
* cron 시작
# sudo service cron start
* cron systemctl 활성화
# sudo systemctl enable crond
*cron systemctl 등록 확인
# sudo systemctl enable cron.service

 

3. 설정 방법

1) Crontab 파일 위치 및 조회
작업 설정 파일을 Crontab 파일이라고 부르며, 이 파일의 위치는 OS별로 차이가 있다.
리눅스는 /var/spool/cron/ID, 솔라리스는 /var/spool/corn/crontabs/ID에 위치한다.
그럼 이 파일을 직접 수정해야 하는가? 그렇지 않다. crontab 명령을 통해 설정과 조회를 한다.

crontab 설정 파일을 새롭게 편집하고자 한다면 -e 옵션을 주고, 수정하기 전에 현재 등록된 내용을 보고자 한다면 -l 옵션을 사용하며, 등록된 내용을 삭제하려면 -d 옵션을 사용한다

설정 내용을 조회(-l 옵션).
$ crontab -l
no crontab for truefeel
설정한 적이 없어 아직 비어있다.

- /etc/crontab 파일
- /etc/rc.d/init.d/crond 스크립트
- /var/spool/cron 디렉토리 내의 크론 설정 파일들

2) Crontab 파일 형식

필드 의미 범위
첫번째 0-59
두번째 0-23
세번째 0-31
네번째 1-12
다섯번째 요일 0-7 (0 또는 7=일요일, 1=월, 2=화, ...)
여섯번째 명령어 실행할 명령을 한줄로 씀

- 모든 엔트리 필드는 공백으로 구분된다.
- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다.

ctrontab 설정/수정 (-e 옵션)
crontab -e을 하면 vi 에디터가 나온다(환경변수 EDITOR에 따라 다른 에디터를 사용할 수 있다).
 
$ crontab -e (예제)
# /home 디렉토리를 /BACKUP/home으로 백업 수행
# 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일
30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home > /dev/null 2>&1
#
# 파일/디렉토리 퍼미션 설정
# 40분, 새벽 1시, 매주 일요일
40 1 * * 0  /root/bin/perm_set.sh   > /dev/null 2>&1
#
위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.

3) 설정 예시

시간 설정에서 몇가지 의미있는 것들을 알아보자.
- *표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬레시(/)로 시간 간격을 지정할 수 있다
  (2~10시까지 3시간 간격으로. 즉, 3, 6, 9시를 의미함)

실행 시간 형식 (양식: 분 시 일 월 요일 명령어)
매주 토요일 새벽 2:20   20  2 *  *  6  명령어
매일 오후 4,5,6시     0  4-6   *  *  *  명령어
매일 2시간 간격으로 5분대 5  */2 *  *  * 명령어
매월 1일 새벽 1:15  15  1   1  *  *  명령어
1,7월 1일 새벽 0:30  30  0   1  1,7  *  명령어
매분마다 * * * * * 명령어
월 ~ 금요일 매 5분마다 */5 * * * 1-5 명령어

   
4) /etc/crontab 파일로 설정
* 매시 1회 자동실행하기 위한 시스템 크론 설정

01 * * * * root run-parts /etc/cron.hourly
  → 매일 매시 01분마다 /etc/cron.hourly 디렉토리내에 존재하는 파일들을 실행


* 매일 1회 자동실행하기 위한 시스템 크론설정

02 4 * * * root run-parts /etc/cron.daily
 매일새벽 4시 02분마다 /etc/cron.daily  디렉토리내에 존재하는 파일들을 실행

 

* 매주 1회 자동실행하기 위한 시스템 크론설정

22 4 * * 0 root run-parts /etc/cron.weekly
 매주 일요일새벽 4시 22분마다 /etc/cron.weekly 디렉토리내에 존재하는 파일들을 실행

 

* 매월 1회 자동실행하기 위한 시스템 크론설정

42 4 1 * * root run-parts /etc/cron.monthly
매월 1일새벽 4시 42분마다 /etc/cron.monthly 디렉토리내에 존재하는 파일들을 실행


* root 이외의 사용자에게 crontab 명령어를 이용할 수 있게 하는 방법

 /etc/cron.allow 파일에 사용자의 id를 등록


* 일반사용자의 crontab 명령어사용을 제안하고자 한다면
 /etc/cron.deny 파일에 사용자의 id 를 등록

 

5. Crontab 서비스 관련 명령어

a) 현재 cron deamon이 돌고 있는지 확인
    ps -ef | grep cron
b) cron deamon kill
    kill -9 "pid of cron"
c) deamon 재실행
   /usr/sbin/cron
d) 명령어 위치
   /usr/bin/crontab
e) 사용형식 및 옵션
   crontab [ -u 사용자ID ] 파일
   crontab [ -u 사용자ID ] [-d 크론디렉토리] { -l | -r | -e }
    * -e : 크론탭 설정 입력 파일 (vi 에디터 활용, 설정 입력 후 :wq 로 저장)
       -l : 현재 크론탭에 설정되어 있는 내용 확인
      -r : 현재 크론탭에 설정되어 있는 내용 삭제

 

6. 기타

Crontab 에서 % 문자 사용할 경우 주의 사항
매번 할 때마다 동일한 실수가 계속 발생하여, 정리하여 기억하려고 적습니다.

 

해당 사항은 다음과 같습니다.  
cron을 이용해서, "같은 시간(새벽 4)에, 백업을 하는데, 해당 날짜에 맞는 로그 파일을 생성하고 결과를 저장하자" 입니다.
당연히, date 를 이용하여, date '+%e' 를 이용하면 해당 날짜가 나오니까 다음과 같이 생성하였습니다.

 

0 4 * * * /backupscript.sh > /var/log/backup_result_`date '+%e'`.txt 2>&1
로 생성하였습니다.

위 내용을 shell에서 동작시키면 정상적으로 잘 됩니다.

 

shell> /backupscript.sh > /var/log/backup_result_`date '+%e'`.txt 2>&1
그런데, cron에만 들어가면 아예 동작을 하지 않는 것입니다. 

바로 '%' 문자 때문입니다.

 

% 문자는 crontab에서는 개행 문자라서 계속 아무 동작도 하지 않는 것이었습니다.
사용하려면 escape(\) 문자를 사용해서 표현하셔야 합니다.

 

따라서 위 내용은 아래와 같이 수정했어야 합니다.
[잘못된 예]
0 4 * * * /backupscript.sh > /var/log/backup_result_`date '+%e'`.txt 2>&1

 

[수정본]
0 4 * * * /backupscript.sh > /var/log/backup_result_`date '+\%e'`.txt 2>&1

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

crontab에서 %를 쓰려면, escape(\) 문자를 이용해야 함 



4. FAQ

1) cron 설정한 후에는 crond 데몬을 재실행해야 하나요?

    아닙니다. crontab -e 으로 설정 후 빠져나오면 바로 적용됩니다.
2) truefeel 사용자는 cron을 못 쓰게 하고 싶습니다.
    /etc/cron.allow : 허용할 사용자 ID 목록
    /etc/cron.deny  : 거부할 사용자 ID 목록
    cron.allow 파일이 있으면 이 파일에 들어있는 ID만 사용 가능
    cron.deny  파일이 있으면 이 파일에 들어있는 ID는 사용 불가
    따라서 cron.deny에 truefeel ID를 추가해주면 됩니다.
3) > /dev/null  2>&1 이 무슨 뜻입니까?
    지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
    뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다.

4) crontab -r 했을 때 복구 및 백업 방법

  *복구 방법

   - /var/spool/mail/  폴더에 계정 메일로 날라오게 되어있다.
   - /var/log/cron 파일에 클론들의 로그들이 남는다.
     .cat cron | grep crond | grep CMD |less 등으로 클론 관련 자료만 뽑아서 다시작성하는 방법이있다.
   - /tmp/ 폴더 밑에 다른이름으로 남는 경우도 있다.

 *백업 방법

  - crontab에 매일 특정시간에 백업하도록 설정 (예: 매일 0시 0분에 백업설정)
   0 0 * * * crontab -l > /log/crontab_bak_`date +%Y%m%d%H%M'

 

 참고블로그 : https://luckys.tistory.com/162

 

 

 

+ Recent posts