Gentoo-WiKi

본문 바로가기
사이트 내 전체검색


Gentoo Linux >> System Administration for Gentoo Linux
[목차]
제3장 System Administration

    10. Cron을 이용한 작업 자동화하기


1. Cron 기본


cron은 무엇을 하는가?


Cron은 crontab 명령에 의해서 입력된 예약된 작업을 실행시켜주는 하나의 데몬이다. 작업을 완성시키기 위해 Cron은 사용자 Crontab안에 예약된 작업이 있는지 매 분마다 체크를 하게 된다.


Note: 여기서 crontab 은 클론 작업의 리스트 이면서 리스트를 편집하는 명령이기도 하다.


2. 어떤 클론을 쓸것인가?


Vixie cron


Vixie cron 은 SysV cron을 기반으로한 모든 기능을 가진 Cron이다. 모든 사용자는 자신의 crontab에 사용자 정의 환경 변수를 가질 수 있다. 다른 Cron과 달리 Vixie Cron은 SELinux 와 PAM을 지원한다.


sys-process/vixie-cron의 기능:


SELinux 지원

PAM지원 (/etc/security/limits.conf )

crontabs에 환경변수 설정 가능 (PATH, SHELL, HOME, 등.)

각 사용자별로 자신의 crontab을 가질수 있음, cron.allow와cron.deny에 의해서 제어됨

Dillon's Cron


Dcron 은 간단함, 명쾌함 그리고 안전성을 목표로 하고 있는 Cron이다. 이것은 다른 Vixie와 같이 사용자 정의 환경 변수를 Crontab안에 설정하는 것을 허용하지 않는다.


sys-process/dcron의 기능:


필요없는 기능의 제거로 빠르고 간단함

crontab 의 접근은 cron 그룹만이 가능

Fcron


Fcron은 널리 사용되는 "Vixie cron"과 "anacron" 데몬을 대체하기 위한 프로그램이다. cron 데몬은 시스템 관리에 필수적인 정해진 시간에 프로그램들을 실행시키는 기능을 한다.


sys-process/fcron의 기능:


항상 가동되지 않는 시스템을 위해 디자인 되었음 (예, 이것은 작업이 시작되지 않았을 경우 다시 제시작후에 작업을 시킬수 있다)

환경변수와 많은 다른 옵션들을 crontabs안에 설정 할 수 있음

각 사용자별로 자신의 crontab을 가질수 있음, cron.allow와cron.deny에 의해서 제어됨

향상된 crontab 문법과 많은 새로운 기능들을 지원

Anacron


Anacron은 cron 데몬이 아니다. 이것은 일반적으로 다른 프로그램 사이에서 작동된다. Anacron은 하루동안 특정 간격으로 명령을 실행하고 이것역시 Fcron 처럼 계속 작동되는 시스템이 아니라고 가정한다 또한 이것 역시 만일 시스템이 다운되어서 작업이 실행되지 않았다면 다음에 작업을 할 것이다.


3. cron의 사용


설치하기


원하는 cron을 선택하고 emerge한다.


Code Listing 3.1: cron설치

# emerge dcron

# rc-update add dcron default

# /etc/init.d/dcron start



선택적으로 만일 Fcron을 설치하지 않았다면 당신은 Anacron 역시 설치할 수 있다.


Code Listing 3.2: anacron 설치

# emerge anacron

# rc-update add anacron default

# /etc/init.d/anacron start



System crontab


어떤 Cron 패키지는 설치후 당신에게 crontab /etc/crontab을 실행하도록 말하기도 하는데/etc/crontab파일은 당신 system crontab이다. 기본적으로 젠투설치프로그램은 이것을 사용해/etc/cron.{daily,hourly,weekly,monthly}안에 있는 스크립트를 실행 한다. 여기서 Vixie-cron은 /etc/crontab 안의 예약된 작업을 자동으로 실행한다 하지만 Dcron 과 Fcron 사용자는 crontab /etc/crontab 을 /etc/crontab을 바꾸었다면 항상 실행해주어야만 한다.


참고) system crontab에 설정된 예약된 작업은 Cron-jobs(crontab -l)의 리스트에 나타나지 않는다.


당연히 당신은 어떤 system crontab 도 사용하지 않도록 선택할 수 있다. 만일 당신이 Dcron 이나 Fcron을 선택하였다면 crontab /etc/crontab을 실행하지마라. 그리고 만일 당신이 vixie-cron을 선택하였다면 /etc/crontab안의 모든 내용을 주석처리하라.


Code Listing 3.3: /etc/crontab안의 내용 모두 주석화 하기

# sed -i -e "s/^/#/" /etc/crontab



신뢰된 사용자들에게 cron 접근 허용


만일 당신이 루트를 제외한 사용자들에게 cron 데몬에 접근을 허용하려 한다면 이번 색션을 보아야만 한다. 그렇지 않다면 다음 색션으로 넘어가도 된다. cron-jobs예약하기.


Note: 다른 사용자에게 crontab을 접근하게 하였다면 절대로 cron-jobs을 루트의 권한으로 실행하지 않게 하라. 만일 사용자에게 루트의 crontab을 편집하게 하려 한다면 sudo를 보기바란다..


어떤 Cron패키지를 사용하든지 만일 사용자에게 crontab을 사용하게 하였다면 첫번째로 그 사용자는 cron 그룹이어야한다. 예로 만일 wepy 유저를 Cron 그룹에 넣으려 한다면 다음과 같이 한다.


Code Listing 3.4: cron 그룹에 사용자 넣기

# gpasswd -a wepy cron



만일 Dcron을 사용한다면 당신이 해야할 일은 사용자에게 crontab을 접근할 수 있는 권한을 주는 것이다. Dcron 사용자는 다음 색션으로 가라 cron-jobs예약하기, 다른 Cron을 사용한다면 계속 보라.


만일 당신이 Fcron을 사용한다면 /etc/fcron/fcron.deny 과 /etc/fcron/fcron.allow편집해야 한다.

가장 보안상 좋은 방법은 The most secure way is to first deny everyone in /etc/fcron/fcron.deny에 모두 거부를 하게 하고 다음으로 /etc/fcron/fcron.allow안에 예외 사용자를 넣은 것이다.


중요: 만일 /etc/fcron/fcron.allow 나 /etc/fcron/fcron.deny 가 존재하지 않는다면 기본적으로 모든 사용자가 crontab의 접근이 가능하다




Code Listing 3.5: fcron.deny의 권한설정

all



이제 wepy 사용자가 자신의 cron-jobs를 가질수 있도록 /etc/fcron/fcron.allow 에 다음과 같이 넣는다:


Code Listing 3.6: fcron.allow의 권한설정

wepy



만일 Vixie cron을 선택하였다면 당신은 아마도 바로 /etc/cron.allow를 편집하길 원할 것이다.


중요: 만일 /etc/cron.allow 가 존재한다면 cron그룹의 사용자만이 접근이가능하다 하지만 공백의/etc/cron.deny 가 존재한다면 모든 cron 그룹의 사용자들이 접근을 할 수 있으므로 반드시 /etc/cron.allow가 없다면 공백 /etc/cron.deny 를 두지마라.


예로 만일 wepy사용자에게 접근을 허용하겠다면 /etc/cron.allow 에 다음에 보이는 것 처럼 추가하라:


Code Listing 3.7: /etc/cron.allow 의 권한설정

wepy



cron-jobs 예약하기


crontabs을 편집하는 것은 각 패키지마다 다르지만 모두 기본 명령셋은 지원한다 : crontab의 추가, 변경, 삭제, 출력

다음은 각 패키지별로 명령어를 보여준다.


Version Edit Remove New List

dcron crontab -e crontab -d crontab file crontab -l

fcron fcrontab -e fcrontab -r fcrontab file fcrontab -l

vixie-cron crontab -e crontab -r crontab file crontab -l

Note: Fcron은 crontab도 만든다.


당신은 다음 명령들을 사용하기 전에 먼저 crontab에 대해서 이해를 해야한다. Crontab의 각라인은 5가지 시간 항목을 다음 순으로 명시해야한다::분 (0-59), 시간 (0-23), 날짜 (1-31),달(1-12),요일 (0-7, 월요일은 1,일요일은 0 과 7). 여기서 요일과 달은 mon, tue, jan, feb 과 같이 표기될 수 있다. 각 필드는 범위를 지정하여 명시 할 수 있고 (예, 1-5 혹은 mon-fri) , 또한 특정 시간의 명시를 다음과 같이 콤마 ',' (예 1,3,5 나 mon, wed, fri)를 사용거나 스텝(1-6/2, 1, 3, 5)을 사용하여 명시할 수도 있다


말로만 보면 상당히 혼란스러우니 몇가지 예를 들어보겠다.



Code Listing 3.8: 예

# /bin/false를 매 분마다 실행

*     *     *     *     *        /bin/false 


# /bin/false를 매달 4일  월, 화, 수  1시 35분에 실행

35    1     4     *     mon-wed  /bin/false


# /bin/true를 3월 2일  22시 25분에 실행

25    22    2     3     *        /bin/true


# /bin/false를 매 월,수.금 2시에 실행

0     2     *     *     1-5/2    /bin/false



방금전에 배운것을 테스트해보기 위해서 crons.cron이라는 파일을 생성하고 다음과 같이 만든다:


Code Listing 3.9: crons.cron 편집

$ nano crons.cron

#Mins  Hours  Days   Months  Day of the week

10     3      1      1       *       /bin/echo "i don't really like cron"

30     16     *      1,2     *       /bin/echo "i like cron a little"

*      *      *      1-12/2  *       /bin/echo "i really like cron"



이제 new 명령을 사용하여 위의 테이블을 Crontab에 추가시키자.


Code Listing 3.10: crontab 추가

# crontab crons.cron


Note: 당신은 Redirection을 하지 않고서는 그 어떤 echo 메세지도 보지 못할 것이다.


예약된 cron 작업을 보기 위해서는 다음 명령을 하면 된다.


Code Listing 3.11: Listing cron-jobs

# crontab -l



아마 당신은 crons.cron 에서 작성된 작업 리스트를 볼 수 있을 것이다.


crontab은 echo "i really like cron"를 매분, 매시간, 매일, 매달마다 실행 할 것이다. echo "i like cron a little" 역시 16시30분 1월과 2월의 매일동안 실행을 할 것이다.또한 echo "i don't really like cron" 를 3시10분 1월1일에 실행을 할 것이다.


만일 당신이 Anacron을 사용한다면 ,당신은 이 섹션을 계속 읽어라. 사용하지 않는다면 다음 섹션을 넘어 가라 crontabs 편집 .


Anacron유저는 /etc/anacrontab을 편집해야 되는데 이 파일은 4가지 필드를 가지고 있다: 실행 작업 사이의 날(day) 수, 작업후 지연시간(분), 작업의 이름, 명령


예, echo "i like anacron" 를 매 5일 Anacron이 시작된지 10분후에 실행:



Code Listing 3.12: /etc/anacrontab

5 10 wasting-time /bin/echo "i like anacron"



Anacron은 안에 있는 모든 작업이 끝난후에 종료된다. 그렇기 때문에 만일 작업을 매일 체크하고 싶다면 cron을 사용해야만 한다.체크하는 법은 맨 마지막 섹션에서 설명한다.


crontabs 편집


당신이 만일 시스템에게 얼마나 당신이 cron을 좋아하는지 매분마다 말하는것을 원하지 않는다면 remove 명령을 사용해서 작업을 삭제 할 수 있다. 삭제한후에는 작업이 삭제되었는지 확인하도록 한다.


Code Listing 3.13: Removing a crontab

# crontab -d (vixie는 -r)

# crontab -l



crontab -l을 하면 더이상 작업 리스트를 보여주지 않을 것이다. 만일 작업들이 보인다면 삭제 작업이 실패 한것이다. 이경우 자신의 cron 패키지와 명령이 맞는 지 확인하기 바란다.


자 우리는 slate를 가지고 있는데 이것을 루트 crontab에 넣어 좀더 유용하게 만들어보자. 대부분의 사람들이 updatedb 를 매주 실행하여 slocate 가 제대로 작동되도록 할 텐데, 이 기능을 crontab에 넣어서 좀 더 편리하게 사용하도록 하자 ,

먼저 crons.cron 을 편집하여 다음과 같도록 한다.


Code Listing 3.14: A real crontab

22 2 * * 1    /usr/bin/updatedb



이것은 updatedb를 매주 월요일 새벽 2시22분에 작동시키겠다는 의미이다 이제 new 명령을 사용하여 위의 리스트를 추가한후 확인 하도록 한다.


Code Listing 3.15: cron-jobs 추가 및 확인

# crontab crons.cron

# crontab -l



자 또한 포티지 업데이트인 emerge --sync 를 날마다 자동적으로 실행하게 해보자. 여기서 당신은 위에서 했던 방법대로 할 수 있으나 edit 명령을 사용해서 편집을 할 수 도 있다.



Code Listing 3.16: crontab 편집

# crontab -e



위 명령을 하면 당신의 에디터로 사용자 crontab을 볼 수 있는데 여기서 우리는 emerge --sync 를 매일 새벽 6시30분에 실행 되도록 하겠다:



Code Listing 3.17: crontab

22 2 * * 1    /usr/bin/updatedb

30 6 * * *    /usr/bin/emerge --sync

(만일  anacron을 사용한다면 다음 라인을 추가하라)

30 7 * * *       /usr/sbin/anacron -s



다시, 예약을 하고나서는 반드시 체크를 하도록 한다.


[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.