『리눅스 사용자 모임-리눅스 초보자 교실 (go LINUX)』 97번
제 목:[강좌] Cron - 부제:리눅스 학습과정 - Manual/Cron/At
올린이:jhkwak (곽재혁 ) 99/07/31 15:55 읽음:859 관련자료 없음
-----------------------------------------------------------------------------
Cron
1. Cron 이란?
이번 글에서는 리눅스의 사용을 보다 편리하게 해주는 cron에 대해 알아보도록
하겠는데요, 그냥 간단히 Cron이 무엇인지, 사용방법은 어떤 것이 있는지만
살펴 보는 것이 아니라 어차피 초보자를 위한 강좌이니까 Cron이라는 것이
무엇인지 스스로 알아내는 과정을 중심으로 Cron을 설명하겠습니다.
말하자면, 물고기를 잡아만 주는 것이 아니라, 물고기 잡는법도 알려드리겠다는
것이지요...
Cron이라는 것이 무엇일까요?
Cron에 대해 설명하기 위해 우선 man cron을 해봅시다.
그러면 Cron에 대해 자세히 설명되어있습니다.
초보님들을 위해 간단한 man의 사용을 짚어보고 넘어가는것이 좋겠군요.
1.1 man - manual 페이지를 보여줌
실행 화일 : /usr/bin/man
설정 화일 : /etc/man.config
관련 화일 : /usr/bin/manpath
man은 특정명령어의 manual(설명서) 페이지를 보여주는 것입니다.
초보자나 숙련자나 할 것 없이 아마도 Linux/Unix 사용하시는 분들이
가장 많이 사용하는 명령이 아닐까 싶군요.
man의 사용법은 'man man'이라고 하시면 알 수 있습니다 ^^;
우리가 살펴보고자 하는 cron의 manual 페이지를 예로 man에 대해 더 알아봅시다.
우선 cron 설치 RPM 페키지에 man에서 사용할 수 있는 manual 화일이
어디에 설치되는지 알아보도록 합시다.
(rpm의 사용법은 다른 분의 글을 참고해 주세요.)
---- 인용 시작 ----
[jhkwak@mind ~]$ rpm -qa |grep cron
crontabs-1.7-6
vixie-cron-3.0.1-33
[jhkwak@mind ~]$
---- 인용 끝 ----
위와 같이 'rpm -qa'라고 하면 자신의 컴퓨터에 설지되어있는 모든 페키지
이름이 나열되고요, 그중에서 우리에게 필요한 cron관련 페키지명만 얻기위해
위와 같이 grep을 사용하였습니다.
이번에는 rpm DataBase에 등록되어있는 해당 페키지의 설명을 봅시다.
---- 인용 시작 ----
[jhkwak@mind ~]$ rpm -qi crontabs
Name : crontabs Relocations: (not relocateable)
Version : 1.7 Vendor: Red Hat Software
Release : 6 Build Date: Thu 15 Apr 1999 10:00:31
AM EDT
Install date: Tue 13 Jul 1999 09:39:03 PM EDT Build Host: porky.devel.redha
t.com
Group : System Environment/Base Source RPM: crontabs-1.7-6.src.rpm
Size : 4856 License: public domain
Packager : Red Hat Software <http://developer.redhat.com/bugzilla>
Summary : Root crontab files used to schedule the execution of programs.
Description :
The crontabs package contains root crontab files. Crontab is the
program used to install, uninstall or list the tables used to drive the
cron daemon. The cron daemon checks the crontab files to see when
particular commands are scheduled to be executed. If commands are
scheduled, it executes them.
Crontabs handles a basic system function, so it should be installed on
your system.
[jhkwak@mind ~]$ rpm -qi vixie-cron
Name : vixie-cron Relocations: (not relocateable)
Version : 3.0.1 Vendor: Red Hat Software
Release : 33 Build Date: Wed 14 Apr 1999 07:09:48
PM EDT
Install date: Tue 13 Jul 1999 09:58:41 PM EDT Build Host: porky.devel.redha
t.com
Group : System Environment/Base Source RPM: vixie-cron-3.0.1-33.src.
rpm
Size : 58402 License: distributable
Packager : Red Hat Software <http://developer.redhat.com/bugzilla>
Summary : The Vixie cron daemon for executing specified programs at set time
s.
Description :
The vixie-cron package contains the Vixie version of cron. Cron is a
standard UNIX daemon that runs specified programs at scheduled times.
Vixie cron adds better security and more powerful configuration options
to the standard version of cron.
[jhkwak@mind ~]$
---- 인용 종료 ----
'rpm -qi 패키지명'을 하면 해당 패키지에 대한 설명을 볼 수 있습니다.
이제, 각 페키지가 어떤 화일들로 이루어져있는지 살펴 봅시다.
---- 인용 시작 ----
[jhkwak@mind ~]$ rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/usr/bin/run-parts
[jhkwak@mind ~]$ rpm -ql vixie-cron
/etc/cron.d
/etc/logrotate.d/cron
/etc/rc.d/init.d/crond
/etc/rc.d/rc0.d/K60crond
/etc/rc.d/rc1.d/K60crond
/etc/rc.d/rc2.d/S40crond
/etc/rc.d/rc3.d/S40crond
/etc/rc.d/rc5.d/S40crond
/etc/rc.d/rc6.d/K60crond
/usr/bin/crontab
/usr/man/man1/crontab.1
/usr/man/man5/crontab.5
/usr/man/man8/cron.8
/usr/man/man8/crond.8
/usr/sbin/crond
/var/spool/cron
[jhkwak@mind ~]$
---- 인용 끝 ----
위와 같군요. 여기서 man에서 사용할 수 있는 manual 화일은
/usr/man/man1/crontab.1
/usr/man/man5/crontab.5
/usr/man/man8/cron.8
/usr/man/man8/crond.8
이렇게 네개 입니다. 디렉토리를 보면 알수 있지요.
그리고, 화일명은 man에서 사용할 명령어 명이고요, 뒤에 붙는 숫자는
Manual 페이지의 성격을 나타내는 Section 명입니다.
Section은 1부터 8까지 있는데, 각각은 아래와 같은 의미를 갖습니다.
Section 명 칭 의 미
1 Commands Shell에서 사용자가 사용할 수 있는 명령어들에
대한 Manual
2 System Calls Kernel에 의해 수행되어야 하는 함수들
3 Library Calls 해당 Linux Box에서 사용하는 Library의 함수들에
대한 Manual
4 Special files 특별한 화일들에 대한 Manual (보통은 /dev이하의 화일들)
5 File Formats 사람이 읽어볼 수 있는 설정화일들(보통은 /etc이화 화일들)
and convertions
6 Games Game에 대한 Manual
7 Macro Packages System의 표준(Standard)과 관련된 Manual
and convertions (표준 문자표현, 표준 프로토콜, 그래픽표현 표준 등)
8 Kernel Kernel의 routine들과 관련된 Manual
routines
(이건 여담인데, 솔직히 말해 Linux용 Game중에는 재미 있는게 너무 없어요 T_T)
위의 예와 같은 경우 crontab이 Section 1과 5가 있습니다.
같은 crontab에 관한 설명이지만, 담고 있는 의미가 다른것이지요.
Section 1의 crontab을 보고 싶으면 'man 1 crontab'이라고 하면되고,
Section 5의 crontab을 보고 싶으면 'man 5 crontab'이라고 하시면 됩니다.
모든 Section을 다 살펴 보기 위해 'man -a (명령)'을 사용합니다.
자, 이제 'man cron'해보시면 아래와 같은 문장을 보실 수 있을 겁니다.
cron - daemon to execute scheduled commands (Vixie Cron)
cron은 윈강아지의 '스케줄 관리'프로그램과 같은 것입니다.
특정 시간에 특정 명령이 실행되도록 해주는 것이지요.
이 cron을 이용해서, 컴퓨터를 잘 사용하지 않는 새벽시간에
매달 한번씩 하드를 백업해 놓는명령을 실행 시킨다거나,
하루에 한번씩 뉴스그룹에서 뉴스를 긁어온다거나 하는 명령을
자동으로 실행 시킬 수 있습니다.
그리고, 명령어 실행 결과는 자신의 메일로 보내집니다.
커널 컴파일 같이 오랜 시간이 걸리는 명령, 실행결과를
살펴보아야 하는 명령의 경우 cron을 사용하면 편리하겠지요.
(커널 컴파일은 사실 Cron보다 at 페키지를 더 많이 사용하곤 합니다.
at의 사용법은 Cron과 거의 같습니다.
at에 대한 설명은 여기서는 하지 않겠습니다만, 간단히 설명 드리면
atd는 crond와 비슷하고, at은 crontab과 비슷합니다.
atq는 at의 작업 대키 큐(Queue)에 어떤 것이 등록되어있는지 보여주는 것이고,
atrm은 작업 큐에 대기중인 작업을 지우는 것입니다.
batch도 at페키지에 포함되어있는 프로그램인데,
Linux Box의 load average가 0.8이하일때, 다시말해 시스템의 자원이 어느정도
여유가 있을때 아무때나 명령을 실행하는 것입니다.
자세한 것은 지금 이 글에서 제가 적는 Cron의 사용법을 알아가는 과정과
같은 방법으로 직접 알아보세요.. 말하자면 숙제입니다 ^^;)
특히, 윈강아지와는 다르게, Linux Box는 Web 써버로 사용한다거나
화일 써버로 사용한다거나 해서 24시간 계속 켜 놓고 사용하는 경우가 많은데
이러한 특징을 생각해 볼때 cron은 정말 막강한 기능을 가지고 있는 것입니다.
(윈강아지의 스케줄관리프로그램에서 매달 새벽에 디스크 정리를 하라고 해
놓으면 거의 제대로 동작하지 않습니다. 왜냐하면 대부분의 경우 윈강아지는
사용하지 않을때 특히 새벽같은 시간에는 꺼 놓기 마련이니까요...)
이건 여담인데, 제 친구의 경우 Cron을 사용해서 매일 특정시간에 자기
헨드폰으로 메시지를 전송하게 해 놓고서는, 시간마다 자기 Web 페이지에
몇명이 접속했는지 확인하더라구요 ^^;;;
(이 내용은 Expect 관련 자료를 를 참조해 보세요..
Expect로 나우누리에 접속해서 bb명령을 사용하는 겁니다...
Expect 관련 책은 O'Reilly출판사의 Exploring Expect라는 책이있는데
번역본은 아직 못봤군요. Expect관련 자료는 이책이 거의 유일한듯...)
1.2 Cron - /usr/sbin/crond, /etc/crontab, /etc/cron.d/*
실행 화일 : /usr/bin/crontab, /usr/sbin/crond
설정 화일 : /etc/crontab, /etc/cron.d/*, /var/spool/cron
참조 화일 : /usr/man/man1/crontab.1, /usr/man/man5/crontab.5
cron은 우선 부팅이후에 계속 메모리에 상주하는 crond 프로그램과
cron에서 사용할 스케쥴 정보를 등록해주는 crontab 프로그램으로
나뉩니다.
crond는 위의 rpm 명령에서 살펴 보았듯이
/etc/rc.d/init.d/crond
에 의해 부팅시에 데몬('crond'의 'd'가 데몬이라는 의미이지요)으로
동작합니다.
crond는 항상 메모리에 상주하면서 매분마다 자신이 실행시켜야 할
명령이 있는지 없는지 확인하고 있다면 실행시키고 없다면 그냥 기다리게
됩니다.
자신의 메모리에 crond가 떠 있는지 아닌지를 확인하기 위해서는
ps를 사용하게 됩니다.
(ps에 대해서 설명해 드리고 싶은데, 내용이 상당이 많아서 일단 다음으로
미루겠습니다. 잘못하면 배보다 배꼽이 더 커지겠네요.. ^^;)
저의 경우를 살펴 보면
---- 인용 시작 ----
[jhkwak@mind ~]$ ps -C crond
PID TTY TIME CMD
301 ? 00:00:00 crond
[jhkwak@mind ~]$
---- 인용 끝 ----
crond에서 사용할 스케줄 정보는 /etc/crontab 화일과
/etc/cron.d 디렉토리 아래에 있는 모든 화일입니다.
저의 경우를 살펴 보면
---- 인용 시작 ----
[jhkwak@mind /etc]$ pwd
/etc
[jhkwak@mind /etc]$ cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
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
[jhkwak@mind /etc]$ ls -la cron.d
total 6
drwxr-xr-x 2 root root 1024 Apr 14 19:09 ./
drwxr-xr-x 34 root root 4096 Jul 31 08:34 ../
-rw-r--r-- 1 root root 86 Apr 19 17:46 kmod
[jhkwak@mind /etc]$ cat cron.d/kmod
# rmmod -a is a two-hand sweep module cleaner
*/10 * * * * root /sbin/rmmod -as
[jhkwak@mind /etc]$
---- 인용 끝 ----
조금 알아보기 어렵지요?
/etc/crontab 화일은 vi로 열어서 편집하게 됩니다.
이 화일에서는 cron이 동작할 명령과 그 명령이 실행될 시간, 그리고
실행될때의 환경변수 값들을 설정해 주게 됩니다.
위의 예에서와 같이
name = value
와 같이 적게 되면 이것은 환경변수들을 설정해 주는 것이되고
'#'로 시작하는 줄은 주석이 됩니다.
환경변수중 'MAILTO' 값은 명령들이 실행된 뒤 누구에게 실행 결과를
메일로 보내줄것인가를 정해주는 값입니다.
이제 시간 설정법에 대해 설명 드리지요.
위에서 인용한 것들을 예로 들어서 설명해보지요.
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
여기서는 7개의 필드로 구분됩니다.
물론 예에서는 8개의 필드인것 처럼 보이지만 7번째 이후의 필드는
하나로 인식 됩니다.
앞의 5개의 필드는 시간을 적는 것이고, 6번째 필드는 해당 작업의
소유자를 적어주게 됩니다.
시간 필드는
첫번째 필드는 '분'을 의미합니다. 갖을 수 있는 값은 0부터 59까지 입니다.
위의 예에서는 각각 01분, 02분, 22분, 42분 을 의미하고, 경우에 따라
'*/10'과 같이 써주는 경우도 있는데 이경우는 '매 10분마다'라는 의미가 됩니다
두번째 필드는 '시간'을 의미합니다. 갖을 수 있는 값은 0부터 23까지 입니다.
위의 예에서 '*'는 매시간 마다라는 의미가 됩니다.
그리고, '1,2,3,4'와 같이 뛰어쓰지 않고 여러개를 적어줄 수도 있고 같은 의미로
'1-4'와 같이 써줄수도 있습니다. '1-2,3-4'와 같이도 쓸 수 있겠지요..
그리고, '1-9/2'와 같이 써줄 수도 있는데 이경우는 '1,3,5,7,9'를 의미합니다
세번째 필드는 날짜 입니다. 갖을 수 있는 값은 0분터 31까지 입니다
(여기서 0은 달의 마지막을 의미합니다.)
적는 법은 '시간'의 그것과 같습니다.
네번째 필드는 '달'을 의미 합니다. 갖을 수 있는 값은 0부터 12까지 입니다.
(여기서 0은 12월을 의미합니다.)
역시 적는 법은 '시간'의 그것과 같습니다.
다섯번째 필드는 '요일'을 의미합니다. 갖을 수 있는 값은 0부터 7까지 입니다.
(0과 7은 일요일입니다.)
여기서 숫자대신에 영문자를 써 줄수도 있습니다. 예를 들어 일요일의 경우
0이라고 쓰거나 7이라고 써도 되지만, 'sun'이라고 써주어도 됩니다.
역시 적는 법은 '시간'의 그것과 같습니다.
여섯번째 필드는 말씀 드린데로 소유자를 적어줍니다.
일곱번째 필드는 실행 시킬 명령어 인데, 'run-parts'라는 것은 처음 보시죠?
몇가지 인용해 보겠습니다.
---- 인용 시작 ----
[jhkwak@mind ~]$ whereis run-parts
run-parts: /usr/bin/run-parts
[jhkwak@mind ~]$
---- 인용 종료 ----
즉, 하나의 프로그램입니다. 이 프로그램은 스크립트입니다. 즉, vi로 읽어보면
어떻게 동작하는지 알 수 있다는 말이지요. (물론 스크립트를 읽을 줄 아셔야
하지요 ^^;;)
하는 일은 뒤에 Argument 값으로 주는 디렉토리명 아래에 있는 화일들을
모두 한번씩 실행시켜 주는 것입니다.
그러니 위의 /etc/crontab 화일의
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
라는 것은 매일 매시간마다 한번씩 /etc/cron.hourly라는 디렉토리 아래에 있는
모든 프로그램을 한번씩 실행켜주는 것이고요,
그 다음 것들도 보시면 아실 것 같군요..
/etc/cron.d/*에 있는 화일(위의 예에서는 kmon)도 /etc/crontab과 같이
사용하시면 됩니다.
그러니까 정리를 하면 crond는 부팅할때에 뜨고,
뜬 뒤에는 /etc/cron.d아래에 있는 모든 스케줄 정보 화일과
/etc/crontab 스케줄 정보 화일을 가지고 동작하게 됩니다.
그런데, 위의 /etc/crontab의 경우를 보면 결국
/etc/cron.d와 /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly,
/etc/cron.monthly가 모두 crond와 관련이 있는 디렉토리들입니다.
정리가 되지요? 그럼 한가지 더 하겠습니다. (^^;;)
1.3 crontab
실행 화일 : /usr/bin/crontab
설정 화일 : /var/spool/cron/*
참조 화일 : /usr/man/man1/crontab.5
이제까지 설명드린 /etc/crontab과 /etc/cron.d/* 화일은 모두 root가
사용하게 되는 시스템 전반에 관한 Cron 스케줄 정보 화일이었습니다.
crontab은 사용자들 개개인의 cron 스케줄 정보화일을 작성하게 해주는
프로그램입니다. (일반사용자들을 위한 것이지요.)
'crontab -e'을 실행시키면 보통은 vi가 뜨는데(설정에 따라 다른 에디터가
뜰수도 있습니다) 여기서 자신만의 스케줄 정보를 작성할 수 있게 됩니다
스케줄 정보 화일 작성 방법은 위에서 설명 드린것과 거의 같은데요
한가지 다른 것은 여섯번째 필드가 '소유자'를 나타내는 필드가 아니라
바로 실행 명령을 적는 필드가 되는 것입니다.
소유자는 바로 'crontab'을 실행시킨 사용자가 되기 때문이지요.
예를 들어 jhkwak라는 아이디의 사용자가 crontab을 사용해서 스케줄
정보 화일을 작성하게 되면 아래와 같을 수 있겠지요.
---- 인용 시작 ----
[jhkwak@mind ~]$ whoami
jhkwak
[jhkwak@mind ~]$ crontab -e
crontab: installing new crontab
[jhkwak@mind ~]$ crontab -e
"/tmp/crontab.1669":2: bad day-of-week
errors in crontab file, can't install.
Do you want to retry the same edit? y
crontab: installing new crontab
[jhkwak@mind ~]$ cd /var/spool/cron
/var/spool/cron: 허가 거부됨.
[jhkwak@mind ~]$ su
Password:
[root@mind jhkwak]# cd /var/spool/cron
[root@mind cron]# ls
jhkwak
[root@mind cron]# cat jhkwak
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.1669 installed on Sat Jul 31 15:15:28 1999)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Testing..
01 23 * * sun rm -fr ~/Desktop/Trash/*
[root@mind cron]#
---- 인용 종료 ----
위에서 처음 crontab -e를 사용하고나서 스케줄이 등록되었습니다.
두번째 crontab -e 명령에서는 제가 스케줄 정보를 엉터리로 작성해봤더니
형식에 맞는다면서 다시 편집하겠느냐고 물어오는 군요.
그리고, root인경우는 /var/spool/jhkwak화일을 직접 편집할 수 있겠지만,
일반 유저는 그게 안되니까 항상 crontab을 사용해서 편집해야하겠지요.
그리고, 위의 예에서 crontab을 사용한 사용자가 jhkwak이니까
crontab 스케줄 편집시에 소유자는 적어주지 않아도(적어주면 안됩니다)
jhkwak가 소유자라고 간주하게 됩니다.
(참고, 내부에서는 /var/spool/cron 아래에 생성될 스케줄 정보화일의
화일이름은 /etc/passwd 화일을 참조한다고 하는군요.)
여기까지가 cron에 관한 설명이었습니다.
아니, 적확히는 Cron이라는 페키지의 사용법을 스스로 알아내는 방법을
알려드리는 설명이었습니다.
at이라는 Cron과 비슷한 프로그램이 있는데, 저 같은 경우 Cron보다도 at을
더 많이 사용하게 됩니다. 사용하기가 편리하기 때문이지요.
Linux/Unix용 어플리케이션은 아주 빠른 속도로 발전하고 있습니다.
그리고 새로 생겨나는 어플리케이션들도 아주 많고요.
그래서, 새로운 어플리케이션의 사용법을 남들 보다 빠르게 익히는 방법은
그 패키지를 개발한 개발자가 만든 Manual화일을 사용하는 것입니다.
비록 한국인들에게는 영어로 된 Manual 화일들에 거부감을 느끼실지 모르겠지만
번역본과 개발자 이외의 다른 사람이 작성한 참조글을 구해서 읽는 방식으로
어플리케이션 사용법을 익히기만 한다면 언제나 남들보다 뒤처질 수 밖에 없지요.
비록 미흡하나마 rpm페키지로 설치한 프로그램의 정보를 얻어서, 메뉴얼 페이지를
통해 해당 프로그램의 사용법을 알아내는 과정을 서술 식으로 소개해 보았습니다.
비단 Cron의 경우만이 아니라 다른 페키지들도 위와 같은 방식으로 사용법을
익히게 되는 것이므로 초보자님들에게 조금이나마 도움이 되었으면 좋겠다는
생각으로 써본 글이었습니다.