LINUX
2018.10.01 / 21:44

cron

Chitta
추천 수 5

cron 은 Unix 계열 OS 에서 오랫동안 사용되어진 작업 스케줄러이다. crontab 이라는 설정 파일을 통해서 수행할 작업과 수행할 일시를 지정한다.

 

 RHEL 의 cron 은 빅시 크론(vixie-cron) 이라는 패키지를 사용했으나 버전 6 부터는 빅시 크론대신 cronie 라는 패키지가 들어 있다. cronie 의 차이점은 anacron 이라는 부가 유틸리티를 사용하여 정기적인 작업을 수행하는 부분에 있다.

 

정기적인 작업은 /etc/anacrontab 파일을 사용하여 수행하게 된다. 매일 수행할 작업은 /etc/cron.daily 디렉터리에 있으며 주간 작업은 /etc/cron.weekly, 월간 작업은 /etc/cron.monthly  디렉터리를 있는 내용을 실행하게 된다.

기본 설정된 매일 수행 작업은 서비스의 로그 파일을 정리하는 logrotate, 키워드로 매뉴얼을 검색할 수 있게 인덱싱 해주는 makewhatis.cron 명령등이 있다.

crontab

crontab 은 cron 이 실행할 명령어와 수행 시간을 지정하는 설정 파일 이름이자 명령어이다. crontab option 형식으로 실행하며  자주 쓰는 옵션은 다음과 같다.

 

옵션
  • -l, 목록보기
    현재 사용자의 crontab 에 등록된 내용을 터미널에 출력해 준다.
  • -r, 삭제
    현재 사용자의 crontab 에 등록된 내용을 모두 삭제한다.
  • -e, 편집
    현재 사용자의 crontab 을 편집기를 이용하여 편집한다. 편집기는 VISUAL 환경 변수에 지정되어 있는 프로그램을 사용한다.
CRONTAB 설정 형식

crontab 은 # 문자는 주석으로 처리되며 탭이나 공백을 구분자로 하여 6개의 필드를 갖는다. 앞의 5개의 필드는 시간과 날자를 지정하며 6번째는 실행할 명령어이다. 

  1. 분(0-59)
  2. 시간(0 - 23)
  3. 일 (1-31)
  4. 달(1 - 12) - 또는 jan, feb, mar,apr 같이 축약어로 지정 가능
  5. 주일(0 - 6), 일요일은 0 또는 7 이 된다. 2로 지정할 경우 화요일이며 sun, mon, tue, wed, thu 같이 축약어로도 지정 가능하다.

시간과 날자를 지정하는 필드에 별표(*) 를 기술할 경우 해당 필드의 모든 시간에 실행하겠다는 의미가 된다. 예로 분에 * 를 지정하면 매 분마다 실행하며 시간에 지정할 경우 1시간마다, 날자에 지정할 경우 매일 실행하게 된다.

여러 시간과 날자를 지정할 경우 콤마(,) 를 구분자로 지정할 수 있다. 또 특정 구간을 지정할 경우 대쉬(-)를 사용할 수 있다. 다음과 같이 분 항목에 지정했을 경우

0,3,17-1940 1-2 * * * ls

매일 오전 1시, 2시에 매 분 정각, 3분, 17분, 18분, 19분, 40분에 ls 명령어를 실행하게 된다.

실행할 명령어는 일반 명령어나 사용자가 작성한 쉘 스크립트등이 될 수 있다. 명령어 실행시 옵션을 넘겨줘야 한다면 crontab에 옵션을 포함한 명령어를 기술하지 말고 별도의 스크립트로 작성한 후에 스크립트를 연결하는게 안전하다.

예로 매일 밤 11시 정각에 에 mysqldump 로 백업을 한다고 가정해 보자. mysqldump 는 사용자명, 암호, 백업db 등 여러 가지 옵션을 넘겨주어야 한다. crontab 을 다음과 같이 작성하는 것 보다는

0 23 * * * mysqldump -u root -pmypwd --databases mydb1 mydb2 > /root/mysql_dump.sql

다음과 같이 /usr/local/sbin/mysql_dump.sh 에 쉘 스크립트를 작성한 후에 이 내용을 crontab 에 적어주는게 안전하게 실행될 수 있다.

/usr/local/sbin/mysql_dump.sh
#!/bin/sh
  
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export PATH=$PATH:/usr/local/bin
mysqldump -u root -pmypwd --databases mydb1 mydb2 > /root/mysql_dump.sql
0 23 * * * /usr/local/sbin/mysql_dump.sh
실행 스크립트와 cron 설정

cron 은 보안 이슈때문에 사용자의 쉘 초기화 파일(.bashrc, .bash_profile)을 읽지 않는다.

그러므로 실행할 프로그램이 /usr/bin이나 /bin 같이 일반적인 경로에 있지 않는다면 초기화 파일에 PATH 나 LD_LIBRARY_PATH 등 개인적인 환경변수를 지정했어도 cron 이 실행할 수가 없다.

이런 개인적인 설정이 있다면 해당 내용을 cron 이 실행할 쉘 스크립트에도 똑같이 지정해 주어야 한다. 

 

CRON 권한 관리

관리자는 특정 사용자만 cron 을 사용하게 하거나 특정 사용자는 사용하지 못하게 설정이 필요할 수 있다. cron은 다음과 같이 권한을 확인한다.

  1. 만약 /etc/cron.allow 파일이 있다면 이 파일에 등록된 사용자만 cron 을 사용할 수 있다.
  2. 만약  /etc/cron.allow 이 없고  /etc/cron.deny 파일이 있다면 이 파일에 등록되지 않은 사용자만 cron 을 사용할 수 있다.

cron 은 Linux 와 다른 Unix 에서 표준적으로 사용하는 작업 스케줄러이다. 실무 환경에서 백업은 매우 중요한 작업이나 개발자나 관리자가 수작업으로 할 일은 아니고 자동화하여 진행해야 한다.

향후 설정할 버전 관리 서버, 이슈 관리 서버, repostiroy 관리 서버마다 마지막 항목은 데이타를 백업하는 방법을 다룰 예정이며 백업을 정해진 시간에 자동화하는 업무에 cron 을 활용할 것이다.