본문 바로가기

Learning/ └Essential & Admin

Linux_ServerAdmin (11) 스케줄링 관리

Linux_ServerAdmin (11) 스케줄링 관리

 

at 명령어

 

crontab 명령어

 

 

 

정기적인 작업을 수행하는 경우(EX: 스케줄링)

(예) 한루에 한번씩 풀 백업(Full Backup)

 

특정한 시간때에 한번 작업을 수행하는 경우 --> at CMD (atd)

반복적인 작업을 수행하는 경우             --> crontab CMD (crond)

 

 

 

1

 at CMD

 

 

 

at 데몬은 지정한 시간에 어떠한 작업이 실행될 수 있도록 작업 스케줄을 예약 처리해 주는 기능을 한다. at 스케

줄을 사용하기 위해서는 at 데몬이 작동하고 있어야 하므로, 다음과 같이 atd 데몬을 동작시킨다.

 

# service atd restart

Stopping atd:                                              [  OK  ]

Starting atd:                                              [  OK  ]

 

 

 

(명령어 형식)

# at time

Usage: at [-V] [-q x] [-f file] [-m] time

       at [-V] [-q x] [-f file] [-m] -t [[CC]YY]MMDDhhmm

       at -c job [job...]

       (atq | at -l) [-V] [-q x]

       (atrm | at -d | at -r) [-V] [-q x] job ...

       batch [-V] [-f file] [-m]

 

 

 

(명령어 사용예)

■ 작업 선언

# at 1300

# at 10:00pm today

# at now +1 mins

 

■ 작업 확인

# at -l

# atq

 

■ 작업 취소

# atrm N  (N : Job ID)

# at -r N

 

 

 

[EX1] at 명령어 간단한 테스트

[TERM1] 관리자 모니터링 윈도우 1

# tty

/dev/pts/3

 

 

[TERM2] 관리자 명령어 윈도우 2

# date

Sat Mar  8 13:51:45 KST 2014

 

 

# at 1300     (13시 00분)

at> echo hello > /dev/pts/3

at> <CTRL + D>        <----- '<CTRL + D>' 입력

job 1 at 2014-03-09 13:53

 

 

# at -l

1       2014-03-09 13:53 a root

 

 

# atq

1       2014-03-09 13:53 a root

 

 

# at 1400      (14시 00분)

at> echo

at> <CTRL + D>        <----- '<CTRL + D>' 입력

job 2 at 2014-03-08 14:00

 

 

# at 1500      (15시 00분)

at> echo

at> <CTRL + D>        <----- '<CTRL + D>' 입력

job 3 at 2014-03-08 15:00

 

 

# at -l        (# atq)

3       2014-03-08 15:00 a root

2       2014-03-08 14:00 a root

 

 

# atrm 2

# at -r 3

# at -l

#

-> 출력된 내용이 없음(2번 작업은 실행되었고, 3번 작업은 삭제 되었다.)

 

 

 

■ at 명령어 사용자 제한

at 데몬을 사용할 수 있는 사용자를 제한할 수 있는 방법이 있다. /etc/at.allow 파일과 /etc/at.deny 파일을 이용

하여 at을 사용할 수 있는 사용자들을 지정한다.

 

at.deny 파일만 존재하면, at.deny 파일에 존재하는 사용자는 at  명령어를 수행할 수 없고,  at.deny 파일에 존재하지 않는 모든 사용자는 at 명령어를 수행할 수 있다.

at.allow 파일이 존재하면, at.allow 파일에 존재하는 사용자만 at 명령어를 수행할 수 있다. at.allow 파일이존재하면, at.deny 파일은 보지 않는다.

 

         The  /etc/at.allow  and /etc/at.deny files determine which user can submit

         commands for later execution via at(1) or batch(1).

 

         The format of the files is a list of usernames, one on each line.  Whitespace is not permitted.

         The superuser may always use at.

 

         If  the  file  /etc/at.allow  exists,  only  usernames mentioned in it are

         allowed to use at.

 

         If /etc/at.allow does not exist, /etc/at.deny is checked.

 

 

 

[EX] at 명령어 사용자 제한

① 기본 사항 점검

# ls -l /etc/at.*

-rw------- 1 root root 1 Jan 27  2010 /etc/at.deny

 

 

# cat /etc/at.deny

#

-> (설명) at.allow 파일이 없고, at.deny 파일만 존재하는 경우에는 at.deny 파일에 등록된 사용자만 at 명령어를

   수행할 수 없다.

-> at.deny 파일에 기본적으로 사용자 등록이 없기 때문에 at 명령어 사용에 대한 거부할 사용자가 없어서, 모든

   사용자가 at 명령어를 사용할 수 있는 설정이다.

 

② /etc/at.allow 파일 생성

# vi /etc/at.allow

user01

user02

 

-> (설명) at.allow 파일이 존재하는 경우, at.allow 파일에 등록된 사용자만 at 명령어 수행이 가능하고, 등록되

   지 않은 모든 사용자는 사용할 수 없다.

 

③ user01 사용자로 테스트

# su - user01

$ at 1300

at> echo

at> <EOT>                   <---- <CTRL + D> 입력

job 4 at 2010-03-02 13:00

 

 

$ at -l

1       2014-04-05 13:00 a user01

 

 

④ user03 사용자로 테스트

$ su - user03

4       2014-04-05 13:00 a user01

 

 

$ id

uid=502(user03) gid=502(user03) groups=502(user03)

 

 

$ at 1300

You do not have permission to use at.

 

$ exit

$ exit

#

 

(복원) /etc/at.allow 파일을 삭제한다.

         # rm -f /etc/at.allow

 

2

 crontab CMD

 

 

 

cron 데몬은 같은 작업을 주기적으로 반복 실행되도록 하는 작업 스케줄용 데몬으로, 매분, 매시, 매일, 매주, 매월, 매요일 단위로 cron 데몬에 의해서 작업이 실행될 수 있다. /etc 디렉토리에 보면 시, 일, 주, 월, 요일 단위 형태로 cron 디렉토리가 존재하며, 이들 디렉토리에는 작업 예약 스크립트들이 들어 있다. /etc/cron/daily 디렉토리안에는 여러 가지 스크립트들이 존재하는데, 매일 이들 스크립트는 cron 데몬에 의해서 자동적으로 실행된다.

 

(cron 데몬실행)

cron으로 작업 스케줄을 예약하기 위해서는 crond 데몬을 작동시켜야 하는데 다음과 같이 데몬을 재실행해 주면 된

다. 이 작동하고 있어야 한다. 그러므로, 작업 스케줄을 예약하기 전에 항상 crond 데몬이 작동될 수 있도록 다음과 같이 처리한다.

 

# service crond restart

Stopping crond:                                            [  OK  ]

Starting crond:                                            [  OK  ]

 

 

 

(명령어 형식)

# crontab [-u user] file

# crontab [-u user] [ -e | -l | -r ]

 

-e       (edit user's crontab)

-l       (list user's crontab)

-r       (delete user's crontab)

-i       (prompt before deleting user's crontab)

-s       (selinux context)

 

 

 

 

(명령어 사용예)

■ 작업 선언

# crontab -e               (-e : Edit, # vi /var/spool/cron/<사용자이름>)

# crontab -e -u user01

 

■ 작업 확인

# crontab -l               (-l : List, # cat /var/spool/cron/<사용자이름>)

 

■ 작업 삭제

# crontab -r        (주의) (-r : Remove, # rm /var/spool/cron/<사용자이름>)

 

 

 

[EX] crontab -e/-l/-r 명령어 형식 확인

# cd /var/spool/cron

# ls

#

 

# crontab -e

* * * * * date >> /tmp/date.log

 

 

# crontab -l

-> 내용 확인

 

# cat root

-> 내용 확인

 

# crontab -r

# ls

-> 파일 삭제 된것 확인

 

 

 

 

[EX] crontab 파일 분석

# crontab -l

 분    시    일    월   요일    CMD

0     3     *     *     *     /root/bin/backup.sh

 

  

(분) 0 - 59

(시) 0 - 23

(일) 1 - 31

(월) 1 - 12

(요일) 0 - 7  (0,7: 일요일, 1: 월요일, 2: 화요일)

 

0

1,2,3

1-3

*   

 

(crontab 파일의 형식)

 crontab 파일은 5개의 시간 필드(분/시/일/월/요일)와 한 개의 명령어 필드(명령어/스크립트)로 구성되어 있다.

 각 필드는 공백문자(White Space)를 통해 구분이 된다.

 “분”자리에는 0분 ~ 59분까지 올 수 있다.

 “시”자리에는 0시 ~ 23시까지 올 수 있다.

 “일”자리에는 1일 ~ 31일까지 올 수 있다.

 “요일”자리에는 1월 ~ 12월까지 올 수 있다.

 

(실무적인 예제) /root/bin/backup.sh

분   시   일  월   요일   CMD

--------------------------------------------

0    3    *    *     *    /root/bin/backup.sh                 (하루에 한번씩)

0  0,12   *    *     *    /root/bin/backup.sh                 (하루에 두번씩)

0    3    *    *     0    /root/bin/backup.sh                 (일주일에 한번씩)

0    3    *    *    1,3   /root/bin/backup.sh                 (일주일에 두번씩)

0    3    1    *     *    /root/bin/backup.sh                 (한달에 한번씩)

0    3   1,15  *     *    /root/bin/backup.sh                 (한달에 두번씩)

0    3    1    3,6,9,12    *    /root/bin/backup.sh           (분기에 한번씩)

--------------------------------------------

0    3    1    *     0    /root/bin/backup.sh                 (매달 1일 3시 정각 + 매주 일요일)

--------------------------------------------

 

(목표) 매달 첫번째 일요일날 /root/bin/backup.sh 프로그램을 동작시킨다.

=> crontab + script.sh

 

# crontab -l

0    3    *    *     0    /root/bin/backup.sh

 

# cal

    August 2015     

Su Mo Tu We Th Fr Sa

                   1

 2  3  4  5  6  7  8

 9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30 31

 

# vi script.sh

----------------------------------

...... (중략) ....

DAY=`date +%d`

 

if [ $DAY -le 7 ] ; then

         /root/bin/backup.sh

fi

...... (중략) ....

-----------------------------------

[EX1] at 명령어의 실무예(백업 스크립트 실행)

 

         # cat /root/bin/backup.sh

         --------------------------------------------

         (백업 스크립트 내용 예제)

         cd /home

         tar cvzf /backup/home.`date +%m%d`.tar.gz .

         --------------------------------------------

 

         (현재)        # /root/bin/backup.sh

         (지정된 시간) # echo /root/bin/backup.sh | at 1200

 

 

# vi /root/bin/backup.sh

#!/bin/bash

 

cd /home

tar cvzf /backup/home.`date +%m%d_%H%M%S`.tar.gz . > /backup/backup.log 2>&1

 

 

# chmod 755 /root/bin/backup.sh

 

# ls -ld /home

# ls -ld /backup   (# mkdir -p /backup)

 

# crontab -e

* * * * * /root/bin/backup.sh

 

 

# cd /backup

# watch ls      (# watch CMD)

.....

home.0827_135101.tar.gz

home.0827_135201.tar.gz

home.0827_135301.tar.gz

home.0827_135401.tar.gz

.....

 

# crontab -e

-> 새로 추가된 라인 삭제

 

 

 

 

[EX2] 업그레이드 수행 후 재부팅하는 경우

[TERM1] 업데이트 터미널

# yum -y update

.... 업데이트 수행 중 ......

.... 남은 작업 시간 예상 : 10분 ......

 

[TERM2] 재부팅 명령어 수행 터미널

# at now +30 mins       (# echo "shutdown -r now" | at now +30 mins)

--------------------------------

at> shutdown -r now

at> <CTRL + D>

--------------------------------

 

 

 

 

[EX3] crontab 명령어의 기본 사용법(쉬는 시간 표시)

# mkdir /etc/MESS

# scp 172.16.9.252:/root/shell/CoffeeTime.txt /etc/MESS

# cat /etc/MESS/CoffeeTime.txt

 

# crontab -e

 분   시   일  월  요일  CMD

50 10-18  *   *   6,7  wall < /etc/MESS/CoffeeTime.txt

or

50 10-16  *   *   1-5  wall < /etc/MESS/CoffeeTime.txt

 

 

 

 

 

[EX4] DB 사용자로 로그인/백업

# crontab -e

01 04 * * * /root/bin/DB_backup.sh

 

# vi /root/bin/DB_backup.sh

#!/bin/bash

 

sqlplus /as sysdba << EOF

CMD ;

CMD ;

CMD ;

EOF

 

 

 

[EX5] 수업 종료 후 서버 Power OFF

(Linux)  # echo "/sbin/poweroff" | at now +5 minutes  /* 5분 뒤에 리눅스 서버 종료 */

         # at -r <N>

 

(Window) C:\> shutdown /s /t 600  /* 10분 뒤에 윈도우 서버 종료 */

         C:\> shutdown /a         /* shutdown 취소 */