본문 바로가기

Linux/기타

cron#1

주제 : 리눅스서버의 스케줄 작업 (cron)

과제 :

man scanf(3)

man exec(3)

man ls(1)

man cron(8) -> 각각 뒤의 번호가 뭔지 알아오기


cron 은 리눅스 서버에서 예약 작업을 하는데 사용하는 데몬이다. cron 의 최소 작업단위는 1분이다. at : 한번만 실행하는 스케줄 작업 cron : 주기적으로 실행한는 스케줄 작업 o cron 에 관련된 패키지명 ================================ Fedora, CentOS 6.x : cronie, crontabs CentOS 5.x : vixie-cron, crontabs o cron 에 관련된 파일 ===================== /usr/sbin/crond : cron 데몬 실행파일 /usr/bin/crontab : 사용자 cron 실행파일 /var/spool/cron : 사용자가 cron을 설정할때 설정 파일이 저장되는 디렉토리 /etc/crontab : 시스템 cron 을 설정할때 사용되는 설정파일 /etc/cron.* : - /etc/crontab 에 등록되어 있다. /etc/cron.daily : 하루에 한번 실행하는 스크립트가 모여있는 디렉토리 /etc/cron.hourly : 한 시간에 한번씩 실행하는 스크립트가 모여있는 디렉토리 /etc/cron.monthly : 한 달에 한번씩 실행하는 스크립트가 모여있는 디렉토리 /etc/cron.weekly : 주마다 한번씩 실행하는 스크립트가 모여있는 디렉토리 /etc/cron.allow : user cron 을 허용하는 사용자의 목록이 들어있는 파일 /etc/cron.deny : user cron 을 거부하는 사용자의 목록이 들어있는 파일 - rpm -ql 로 확인이 가능하다. # rpm -q crontabs # rpm -ql crontabs /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly /etc/crontab /etc/sysconfig/run-parts /usr/bin/run-parts +-> 스크립트(명령어들을 모아놓고 배치파일 형식으로 실행하는 스크립트) ex. /etc/cron.daily, cron.hourly, cron.monthly, cron.weekly 디렉토리의 스크립트를 모두 실행해주는 스크립트 파일 /usr/share/man/man4/crontabs.4.gz /usr/share/man/man4/run-parts.4.gz # rpm -q vixie-cron # rpm -ql vixie-cron /etc/cron.d /etc/pam.d/crond /etc/rc.d/init.d/crond /etc/sysconfig/crond /usr/bin/crontab /usr/sbin/crond /usr/share/man/man1/crontab.1.gz /usr/share/man/man5/crontab.5.gz /usr/share/man/man8/cron.8.gz /usr/share/man/man8/crond.8.gz /var/spool/cron


o cron 의 로그파일 ===================== - 모든 데몬들은 로그를 기록하게 되어있다. - 크론을 시작하고 종료하시 실행하는 모든 로그를 이 파일에 기록한다. /var/log/cron --> 크론 데몬이 사용하는 로그



o cron 시작/중지 방법 
=====================
- 쉘상에서 아래처럼 실행하면 된다.
- /sbin/service 은 /etc/init.d 의 파일을 실행시켜주는 스크립트 파일이다.
- /etc/init.d/서비스명 or /etc/rc.d/init.d/서비스명 or service 서비스명
- Usage: /etc/init.d/crond {start|stop|status|reload|restart|condrestart}

# /etc/init.d/crond stop      crond 중지
# /etc/init.d/crond start     crond 실행
# /etc/init.d/crond status    crond 실행상태 점검
# /etc/init.d/crond restart   crond 중지하고 재실행

# /etc/rc.d/init.d/crond stop      
# /etc/rc.d/init.d/crond start    
# /etc/rc.d/init.d/crond status  
# /etc/rc.d/init.d/crond restart

# service crond stop
# service crond start
# service crond status
# service crond restart

o cron 의 간단한 도움말은 
# man crond

/etc/init.d/crond --> 데몬이 아님, crond 데몬을 실행시켜주는 스크립트다!

=====================


o cron 을 사용하기 위한 체크사항
================================
- crond 패키지가 설치되어 있어야 한다.
(Fedora, CentOS 6.x : cronie, CentOS 5.x : vixie-cron, crontabs)
- 데몬을 실행한다.
/etc/init.d/crond start 

o cron 을 이용하는 방법 
=======================
크게 시스템 크론사용자 크론이 있다.

- 시스템 cron 을 이용하는 방법 (root만 사용가능)

설정파일 : /etc/crontab

crond 데몬이 실행되고 있다면 수정하면 바로 적용된다. (only root) drwxr-xr-x root root /etc -rw-r--r-- root root /etc/crontab --> w 권한이 없기 때문에 일반사용자는 사용불가 - 사용자 cron 을 이용하는 방법 (crontab 명령어를 이용한다.) 사용자 cron 은 set-uid, set-gid 권한이 설정되어 있다. user cron 을 설정하면 /var/spool/cron 디렉토리에 사용자명으로 저장된다. rwsr-sr-x 1 root root 309932 Feb 23 2012 /usr/bin/crontab --> w권한이 없지만 일반 사용자가 cron을 설정할 수 있는 이유는 setuid,setgid가 설정되어 있기 때문. 기본적으로 사용자 cron 은 시스템을 설치하면 모든 일반 사용자가 사용자 크론을 사용할 수 있도록 기본값은 열려있지만 보안상 사용자 크론을 막는다면 아래 /etc/cron.allow, /etc/cron.deny 파일을 생성해서 조작해야 한다. Usage : crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] 참고파일 : /etc/cron.allow, /etc/cron.deny /etc/cron.allow : 사용자 크론을 사용할 수 있는 사용자가 담긴 목록 파일 /etc/cron.deny : 사용자 크론을 사용할 수 없는 사용자가 담긴 목록 파일 시스템 사용자에게 크론을 사용하지 못하게 할 경우 /etc/cron.allow 파일을 생성하면 된다. /etc/cron.allow, /etc/cron.deny 두 개가 다 있을 경우 사용자는 CRON 을 사용 못한다. --> 기본적으로는 allow 파일이 없다(deny 만) => 모든 사용자가 사용가능하도록 기본설정이 되어있음 --> allow 파일과 deny 파일의 우선순위는 allow가 높다.

root 와 일반유저가 모두 포함된다. 설정파일 : crontab -e 이용해서 저장하면 /var/spool/cron/<사용자명> 에 파일이 저장된다. drwx------ root root /var/spool/cron -rwsr-sr-x root root /usr/bin/crontab 사용자마다 예약작업을 설정하고 설정한 후 적용 crontab -e : 사용자 cron을 설정 및 편집한다. crontab -l : 사용자 cron에 설정된 목록을 출력한다. crontab -r : 사용자 cron에 설정된 목록을 삭제한다.



o 시스템 cron 의 설정파일 형식
==============================
- 환경변수는 명령어가 실행시 설정된다. 
- 시간설정에는 분 시 일 월 요일 이 들어갈 수 있다.
- 사용자는 명령어를 실행시킬 사용자명이 들어간다.
- 명령어는 실행시킬 명령어가 올 수 있다.
- 명령어의 인자는 생략할 수 있다.
- # 이 들어간 줄은 주석으로 처리한다.
------------- /etc/crontab 의 예 ------------- 
환경변수=값
  :
  :
<시간설정> <사용자> <명령어> [명령어 인자 ...]
  :
  :
----------------------------------------------

o 사용자 cron 의 설정파일 형식
==============================
- 시간설정에는 분 시 일 월 요일 이 들어갈 수 있다.
- 사용자는 명령어를 실행시킬 사용자명이 들어간다.
- 명령어의 인자는 생략할 수 있다.

--------------------------------------
환경변수=값
   :
  :
<시간설정> <명령어> [명령어 인자 ...] : : --------------------------------------

o cron 의 시간설정에 들어가는 값 ================================= 분,시,일,월,요일 * * * * * 분 : 0 ~ 59 시 : 0 ~ 23 일 : 1 ~ 31 월 : 1 ~ 12 or Jan, Feb, Mar ... 요일 : 0 ~ 7 or Sun, Mon ... ( Sunday = 0, 7 , 둘 다 사용 가능)

o cron 의 시간설정 사용 예 1 ============================ - cron 의 최소 작업단위는 1분이다. - 매분 (1분마다) * * * * * - 매년 12월25일 18:00 00 18 25 12 * - 12월25일 월요일 18:00 00 18 25 12 1 - 매일 13:20 20 13 * * * - 매일 새벽 4:30분 30 04 * * * - 10분마다 (00,10,20,30,40,50) */10 * * * * 00,10,20,30,40,50 * * * - 2달마다 (2,4,6 ...) * * * */2 * - 3시간마다 (3,6,9,12,15...) * */3 * * * - 범위를 지정시 -로 지정한다. - 10분 ~ 15분 까지 10-15 * * * * 10,11,12,13,14,15 * * * * - 10분 ~ 15분 까지 , 30분 10-15,30 * * * * 10,11,12,13,14,15,30 * * * * - 새벽 4시 ~ 5시 까지 * 04-05 * * * - 매일 새벽 4시, 8시, 오후 12시, 3시 * 04,08,12,15 * * *


o cron 의 시간설정 사용 예 2 ============================ system cron (/etc/crontab 의 예) - 매월 매일 새벽 4시 20분에 root의 권한으로 /root/bin/backup.sh 스크립트를 실행하는 설정 20 4 * * * root /root/bin/backup.sh - 일요일 오후 2시에 root의 권한으로 time.sh 스크립트를 실행하는 설정 0 14 * * 0 root /root/bin/time.sh - 매일 오후 11시 59분에 root의 권한으로 홈페이지 사용자의 트래픽(인터넷 사용량)을 - 초기화 시키는 설정 59 23 * * * root /root/bin/traffic.sh - 월,수,금 새벽 4시 30분에 clock.sh 스크립트를 실행하는 설정 30 4 * * 1,3,5 root /root/bin/clock.sh system cron의 예) - 매월 매일 새벽 4시 20분에 /root/bin/backup.sh 스크립트를 실행하는 설정 20 4 * * * /root/bin/backup.sh - 일요일 오후 2시에 자신의 권한으로 backup.sh 스크립트를 실행하는 설정 0 14 * * 0 /home/crontest/bin/backup.sh - 매일 오후 11시 59분에 자신의 권한으로 test.sh 를 실행하는 설정 - (PATH 변수에 등록된 값에서 test.sh 를 찾아서 실행) - PATH=/usr/bin:/bin - crontab -e 로 PATH 변수를 변경할려면 아래처럼 변수를 써야 한다. PATH=/usr/bin:/bin:/usr/local/bin:/home/crontest/bin 59 23 * * * test.sh - 월,수,금 새벽 4시 30분에 root 의 권한으로 clock.sh 스크립트를 실행하는 설정 30 4 * * 1,3,5 root /root/bin/clock.sh - 매일 새벽 4시 02분에 사용자 test 의 권한으로 test.sh 스크립트를 실행하는 설정 02 04 * * * su - test -c test.sh

1분마다 datetime.sh 스크립트를 실행하는 설정을 세팅. ** cron 에서 실행되는 스크립트는 반드시 실행권한을 줘야 한다. ** cron 은 기본이 1분단위 **** *** /etc/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 22 4 * * 7 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 10 4 * * * root ls 매일 4시 10분 root 권한으로 ls 실행하시오. 20 * * * * root echo "test ..." > /tmp/test.txt 매시간 20분 마다 root 권한으로 echo "test ..." > /tmp/test.txt 를 실행 # /etc/init.d/crond start # vi /etc/crontab * * * * * root /root/bin/datetime.sh ---> test 용 추가 ~~~~~~~~


=============================================================== LAB> /etc/crontab 의 잘못된 설정된 설정을 확인해보자. -- /etc/crontab -- * * * * root /bin/ls --> * 이 하나 빠짐 ( 원래 5개 ) -- /etc/crontab -- # tail -f /var/log/cron --> 이상이 있을 때 log를 확인해야 한다!! : : Nov 30 11:37:01 localhost crond[32531]: (*system*) RELOAD (/etc/crontab) Nov 30 11:37:01 localhost crond[32531]: CRON: error in (/etc/crontab) problem is (bad day-of-week) -- /etc/crontab -- * * * root /bin/ls -- /etc/crontab -- - 다른 터미널에서 실시간으로 cron 의 로그를 확인한다. # tail -f /var/log/cron --> crond 데몬이 기록하는 로그파일이다. : : Nov 30 11:41:01 localhost crond[32531]: (*system*) RELOAD (/etc/crontab) Nov 30 11:41:01 localhost crond[32531]: CRON: error in (/etc/crontab) problem is (bad month) -- /etc/crontab -- * * * * * /bin/ls --> 사용자가 없다 -- /etc/crontab -- : : Nov 30 11:43:01 localhost crond[32531]: (*system*) RELOAD (/etc/crontab) Nov 30 11:43:01 localhost crond[32531]: CRON: error in (/etc/crontab) problem is (bad command) ===============================================================


=============================================================== LAB> 관리자가 cron을 설정할 수 있는 시스템 cron 을 설정해보자. ( 일반 유저는 시스템 cron을 등록할 수 없다 --> 권한이 없으므로 ) 실행 스크립트명 : datetime.sh 스크립트 내용 : 1분 마다 시간을 /tmp/datetime.txt 에 저장한다. -- 순서 -- 1. cron 을 실행한다. 2. 스크립트를 생성한다. 3. 예약시간을 등록한다. 4. 파일저장 내용을 확인한다. -- 순서 -- 1. cron 을 실행한다. # /etc/init.d/crond start # ps aux | grep crond 2. 실행 스크립트를 생성한다. - 현재 시간을 /tmp/datetime.txt 에 저장하는 스크립트를 /root/bin/datetime.sh 로 생성한다. # rdate -s time.bora.net # cd; mkdir bin ; cd bin # install /dev/null datetime.sh # vi datetime.sh -- datetime.sh -- #!/bin/sh date >> /tmp/datetime.txt -- datetime.sh -- - cron 에 등록하기 전에 먼저 프로그램의 동작여부를 반드시 확인해야 한다. # datetime.sh # cat /tmp/datetime.txt Thu Mar 19 17:43:11 KST 2015 <-- 시간이 나와야 된다. # datetime.sh # cat /tmp/datetime.txt Thu Mar 19 17:43:11 KST 2015 Thu Mar 19 17:43:21 KST 2015 <-- 시간이 추가되야 된다. 3. 예약시간을 등록한다. (시스템 크론) - /etc/crontab 에 1분 마다 실행할 수 있도록 추가한다. # vi /etc/crontab -- /etc/crontab -- : : <기존내용 생략> : * * * * * root /root/bin/datetime.sh -- /etc/crontab -- 4. 파일저장 내용을 확인한다. - tail -f 를 이용해서 실시간으로 확인한다. # tail -f /var/log/cron : : Mar 19 17:48:01 localhost crond[27942]: (*system*) RELOAD (/etc/crontab) Mar 19 17:48:01 localhost crond[28187]: (root) CMD (/root/bin/datetime.sh) # tail -f /tmp/datetime.txt Thu Mar 19 17:46:01 KST 2015 Thu Mar 19 17:47:01 KST 2015 Thu Mar 19 17:48:01 KST 2015 Thu Mar 19 17:49:01 KST 2015 : : ========================================================


==================================================================
LAB> 일반유저가 cron을 설정할 수 있는 사용자 cron 을 설정해보자.

실행 스크립트명 : crontest
스크립트 내용 :  1분 마다 시간을 /tmp/crontest.txt 에 저장한다. 

-- 순서 --
1. 사용자를 생성한다.
2. 스크립트를 생성한다.
3. 예약시간을 등록한다.
4. 예약시간을 확인한다.
5. 파일저장 내용을 확인한다.
6. user cron 파일을 확인한다.
-- 순서 --

0. user cron 을 사용하기 위한 조건을 검사한다.
# ls -l /etc/cron.{allow,deny}
ls: /etc/cron.allow: No such file or directory
-rw-r--r-- 1 root root 0 Mar  9 16:06 /etc/cron.deny
# ls -l /usr/bin/crontab 
-rwsr-sr-x 1 root root 309932 Feb 23  2012 /usr/bin/crontab

1. 사용자를 생성한다.
- cron을 등록할 일반 사용자를 생성한다.
- 참고 : 사용자를 등록할 때도 /var/log/secure 로그파일에 등록된다.
# useradd crontest  

2. 스크립트를 생성한다.
- cron 을 등록할 스크립트를 생성한다.
- install 대신에 touch crontest; chmod 755 crontest 를 사용해도 된다.
- /dev/null 은 특수장치(c)로써 블랙홀과 같다.
# su - crontest
$ mkdir bin; cd bin
$ pwd
/home/crontest/bin

$ install /dev/null crontest
$ vi crontest
-- crontest --
#!/bin/sh
date >> /tmp/crontest.txt
-- crontest --

3. 예약시간을 등록한다.
- 시스템크론과 다르게 사용자 cron은 crontab -e 명령어를 이용하면 된다.
- 이때 vi 편집창이 뜨므로 실행 내용을 추가하면 된다.
$ crontab -e  
* * * * * /home/crontest/bin/crontest

4. 예약시간을 확인한다.
- user cron 에 등록된 설정을 확인한다.
# ls -l /usr/bin/crontab  
-rwsr-sr-x 1 root root 309932 Feb 23  2012 /usr/bin/crontab
    ~~~

# ls -ld /var/spool/cron
drwx------ 2 root root 4096 Mar 19 18:12 /var/spool/cron
# ls -l /var/spool/cron
total 4
-rw------- 1 crontest root 38 Mar 19 18:12 crontest
# cat /var/spool/cron/crontest 
* * * * * /home/crontest/bin/crontest

$ crontab  -l
* * * * * /home/crontest/bin/crontest


5. cron log 와 파일저장 내용을 확인한다.
# tail -f /var/log/cron
  :
  :
ar 19 18:19:01 localhost crond[28542]: (root) CMD (/root/bin/datetime.sh)
Mar 19 18:19:01 localhost crond[28545]: (crontest) CMD (/home/crontest/bin/crontest)
Mar 19 18:20:01 localhost crond[28548]: (root) CMD (/root/bin/datetime.sh)
Mar 19 18:20:01 localhost crond[28551]: (crontest) CMD (/home/crontest/bin/crontest)

$ tail -f /tmp/crontest.txt
Thu Mar 19 18:19:01 KST 2015
Thu Mar 19 18:20:01 KST 2015
  :
  :

6. user cron 파일을 확인한다.
- 일반 유저가 crontab -e 에서 저장했을 경우에 생성되는 임시 파일이다.
# cd /tmp
# ls -l crontab.XXXXVDmsM2 
-rw------- 1 crontest root 43 Nov 14 14:44 crontab.XXXXVDmsM2
# ls -l /var/spool/cron/
total 0

- 일반 유저가 crontab -e 에서 종료했을 경우에 임시 파일이 삭제된다.
# ls -l crontab.XXXXVDmsM2 
ls: crontab.XXXXVDmsM2: No such file or directory

-  Set-UID 권한으로 인해서 /var/spool/cron 디렉토리로 이동했기 때문이다.
# ls -l /var/spool/cron/
total 8
-rw------- 1 crontest root 43 Nov 14 14:45 crontest

- /var/spool/cron 디렉토리로 이동할 수 있는 이유는 /usr/bin/crontab 
- 파일이 Set-UID 권한이 있기 때문이다.
# ls -l /usr/bin/crontab 
-rwsr-sr-x 1 root root 309932 Feb 23  2012 /usr/bin/crontab
==================================================================


==================================================================
LAB> 관리자가 cron을 설정할 수 있게 시스템 cron 을 설정해보자.


실행 스크립트명 : /root/bin/rdate
스크립트 내용 :  timeserver 에서 현재의 시간을 서버에 세팅한다.

-- 순서 --
1. 스크립트를 생성한다.
2. 시스템 시간을 변경한다.
3. 시스템 cron에 예약시간을 등록한다.
4. 변경된 시스템 시간을 확인한다.
5. cron 의 로그를 확인한다.
-- 순서 --

1. 스크립트를 생성한다.
- /root/bin 디렉토리에 rdate 스크립트를 생성한다.
# cd ; cd bin
# install /dev/null rdate
# chmod 755 rdate
# vi rdate.sh
-- rdate --
#!/bin/sh
rdate -s time.bora.net && clock -w
-- rdate --

2. 시스템 시간을 변경한다.
- 시스템 시간을 2012. 05.05 12:03 로 수정한다.
# date 050512032012  
# date               

3. 예약시간을 등록한다.
- 12:05 분에 시스템 시간을 변경하는 스크립트를 예약한다.
# vi /etc/crontab
-- /etc/crontab --
05 12 * * * root /root/bin/rdate
-- /etc/crontab --

4. 변경된 시스템 시간을 확인한다.
- 12:05 분이 지나면 현재 시간으로 변경되면 성공한 것이다.
# date
Mon Jul 28 14:46:47 KST 2014

5. cron 의 로그를 확인한다.
# tail -f /var/log/cron
May  5 12:03:53 localhost crond[11693]: (*system*) RELOAD (/etc/crontab)
May  5 12:05:01 localhost crond[14721]: (root) CMD (/root/bin/rdate)

==================================================================


'Linux > 기타' 카테고리의 다른 글

하드링크 & 심볼릭링크  (0) 2015.04.29
cron#2  (0) 2015.04.29
quota  (0) 2015.04.27
사용자와 그룹  (0) 2015.04.24
프로세스#2  (0) 2015.04.23