쉘스크립트

관리자를 위한 Shell Script

트리스탄1234 2022. 7. 6. 13:26
728x90
반응형

 

1. 시스템 통계 모니터링

시스템 관리자로써의 주된 업무 중 하나는 시스템이 적정하게 운영이 되고 있는지 통계를 통해 확인 하고 관리를 하는 일 입니다. 이번에는 Shell Sciprt를 통해 기본적으로 관리 해야 하는 통계들을 관리 하고 리포팅 하는 스크립트에 대해서 알아 보도록 하겠 습니다.

디스트 공간 모니터링

멸령어로 디스크 공간을 모니터링 하기 위해서는 'df'라는 명령어를 사용을 합니다.

아래는 df 명령어의 출력 결과 입니다.

$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda1 3197228 2453980 580836 81% /
varrun 127544 100 127444 1% /var/run
varlock 127544 4 127540 1% /var/lock
udev 127544 44 127500 1% /dev
devshm 127544 0 127544 0% /dev/shm
/dev/hda3 801636 139588 621328 19% /home

위의 보기에서 root 디렉토리의 사용량을 모니터링 할수 있는 스크립트 구문을 앞에서 배운 sed와 gwak를 이용하여 만들어 보겠 습니다.

$ df | sed -n ’/\/$/p’ | gawk ’{print $5}’ | sed ’s/%//’
81
$

'/' 디렉토리의 사용량이 81%인 것을 볼 수 있습니다.

스크립트 만들기

위의 예제에서 디스크 모니터링을 하는 스크립트를 만들어 보았 습니다. 이제는 이를 이용해서 추출한 데이터를 변수에 저장을 하고 미리 정해놓은 사용량을 초가 할경우 메세지를 관리자에게 보내는 간단한 스크립트를 만들어 보겠 습니다.

cat diskmon
#!/bin/bash
# monitor available disk space
SPACE=`df | sed -n ’/\/$/p’ | gawk ’{print $5}’ | sed ’s/%//`
if [ $SPACE -ge 90 ]
then
echo "Disk space on root at $SPACE% used" | mail -s "Disk warning"
rich
fi
$
$

이제 위에서 만들 스크립트를 crontab에 등록을 하여 사용을 하면 자동적으로 모니터링을 할수 있습니다. crontab사용법은 이전 Chapter 1을 참고 하시기 바랍니다

반응형

.

아래는 cron tab에 등록하는 예제 입니다.

30 0 * * * /home/rich/diskmon ==> 매일 12시 30분에 한번 점검
30 0,8,12,16 * * * /home/rich/diskmon ==> 하루에 4번 점검

디스크 호그 잡기

서버 관리자로써 누가 디스크를 얼마나 사용하고 있는지를 파악하는 것도 중요한 일 중에 하나 입니다.

하지만 불행하게도 명령어를 통해서 이런 정보를 제공 받을 수는 없습니다. 이를 위해 스크립트를 사용하여 얻어낼 수 있습니다.

먼저 'du'명령은 user별 파일과 디렉토리의 사용량을 보여 줍니다. -s 옵션은 사용량을 요약을 해주는 역활을 합니다. 아래 예제를 살펴 보겠 습니다.

$# du -s /home/*
40 /home/barbara
9868 /home/jessica
40 /home/katie
40 /home/lost+found
107340 /home/rich
5124 /home/test
#

리눅스 시스템마다 틀리겠지만 lost+found가 포함되어 있는 경우가 있습니다. 이를 제거 하기 위해 아래와 같이 grep과 -v옵션을 사용하여 제거를 하면 됩니다.

# du -s /home/* | grep -v lost
40 /home/barbara
9868 /home/jessica
40 /home/katie
107340 /home/rich
5124 /home/test
#

그리고 이제는 위의 결과 값에서 불필요한 정보인 경로를 제거하고 사용자 이름만 보이도록 합니다.

# du -s /home/* | grep -v lost | sed ’s/\/home\//’
40 barbara
9868 jessica
40 katie
107340 rich
5124 test
#

이제 내림차순으로 좀 더 보기 좋게 정리해 봅시다.

# du -s /home/* | grep -v lost | sed ’s/\/home\///’ | sort -g -r
107340 rich
9868 jessica
5124 test
40 katie
40 barbara
#

하지만 여기서 부족한 부분은 전체 사용자가 이용하고 있는 디스크 사용량의 합계 입니다. 이 정보를 얻기 위해 아래 명령을 이용하면 됩니다.

# du -s /home
122420 /home
#

이제 위의 명령어들을 조합해서 아래 3가지 정보가 들어 가는 스크립트를 작성해 봅시다.

■ 열의 이름을 표시 하는 첫번째 라인

■ 보고서 본문

■ 전체 사용량

스크립트를 아래와 같이 작성을 해봅시다.

# cat diskhogs
#!/bin/bash
# calculate disk usage and report per user
TEMP=`mktemp -t tmp.XXXXXX`
du -s /home/* | grep -v lost | sed ’s/\/home\///’ | sort -g -r ›
$TEMP
TOTAL=`du -s /home | gawk ’{print $1}’`
cat $TEMP | gawk -v n="$TOTAL" ’
BEGIN {
print "Total Disk Usage by User";
print "User\tSpace\tPercent"
}
{
printf "%s\t%d\t%6.2f%\n", $2, $1, ($1/n)*100
}
END {
print "--------------------------";
printf "Total\t%d\n", n
}’
rm -f $TEMP
#

이제 위의 스크립트를 실행을 시켜 보도록 하겠 습니다.

# ./diskhogs
Total Disk Usage by user
User Space Percent
rich 107340 87.68%
jessica 9868 8.06%
test 5124 4.19%
katie 40 0.03%
barbara 40 0.03%
--------------------------
Total 122420
#

자 이제 원하는 형식의 스크립트를 얻었고 이를 Crontab에 등록을 하여 사용을 하면 되겠 습니다.

CPU와 메모리 사용량 모니터링

이제는 CPU와 메모리의 사용량을 모니터링 할수 있는 스크립트를 만들어 보도록 합시다.

이를 위해서 UPTIME이라는 명령어를 사용해 보도록 하겠 습니다.

UPTIME명령은 아래 4개의 데이터 정보를 결과값으로 돌려 줍니다.

■ 현재 시간The current time

■ 시스템이 운용된 일수, 시간, 분

■ 현재 로그인한 사용자 수

■ 매 1분, 5분, 15분의 평균 부하

$ uptime
09:57:15 up 3:22, 3 users, load average: 0.00, 0.08, 0.28
$

이와 함께 cpu와 메모리의 사용현황을 잘 보여 주는 명령어 중 vmstat 명령이 있습니다.

아래는 vmstat 명령어의 출력 결과 입니다. vmstat을 옵션 없이 실행 시킬경우에 마지막 시스템이 리부팅 시간 이후로 부터의 평균값을 보여 줍니다. 만약 현재의 값을 구하기 위해서는 라인 파라메터와 같이 사용을 하여야 합니다.

아래 출력 결과를 봅시다.

$ vmstat
procs- ----memory--------- ---swap-- --io-- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 178660 13524 4316 72076 8 10 80 22 127 124 3 1 92 4 0
$
$ vmstat 1 2
procs- ----memory--------- ---swap-- --io-- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 178660 13524 4316 72076 8 10 80 22 127 124 3 1 92 4 0
0 0 178660 12845 4245 71890 8 10 80 22 127 124 3 1 86 10 0
$

출력 결과물에서 첫번째 라인은 시스템 리부팅 이후 평균값을 나타내어 주고, 현재 값은 두번째 라인에 표시를해 줍니다. 그리고 위의 각 열들이 의미하는 내용은 아래 표화 같습니다.

자 이제 이를 이용해서 필요한 스크립트를 만들어 봅시다

우선 각 열의 이름을 표시해주는 첫번째 라인은 제거를 하고, 그리고 출력 결과물에서 현재값을 보여 주는 두번째 라인만 구하려면 아래와 같이 하면 됩니다.

$ vmstat | sed -n ’/[0-9]/p’ | sed -n ’2p’
0 0 178660 12845 4245 71890 8 10 80 22 127 124 3 1 86 10 0
$

이제 위에서 추출한 데이터의 추출 시간이 언제인지 표시 하기 위해 data 명령을 아래와 같이 이용을 할것 입니다.

$ date +"%m/%d/%Y %k:%M:%S"
02/05/2008 19:19:26
$

자 이제 스크립트를 만들어 봅시다.

$ cat capstats
#!/bin/bash
# script to capture system statistics
OUTFILE=/home/rich/capstats.csv
DATE=`date +%m/%d/%Y`
TIME=`date +%k:%M:%S`
TIMEOUT=`uptime`
VMOUT=`vmstat 1 2`
USERS=`echo $TIMEOUT | gawk ’{print $4}’`
LOAD=`echo $TIMEOUT | gawk ’{print $9}’ | sed ’s/,//’`
FREE=`echo $VMOUT |sed -n ’/[0-9]/p’ |sed -n ’2p’ |gawk ’{print $4}’`
IDLE=`echo $VMOUT |sed -n ’/[0-9]/p’ |sed -n ’2p’|gawk ’{print $15}’`
echo "$DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE" ›› $OUTFILE
$

gwak를 이용해 출력 결과를 좀더 보기 좋게 만들려면 아래와 같이 사용을 하면 됩니다.

$ cat capstats.csv | gawk -F, ’{printf "%s %s - %s\n", $1, $2, $4}’
02/06/2008 10:39:57 - 0.26
02/06/2008 10:41:52 - 0.14
02/06/2008 10:50:01 - 0.06
02/06/2008 11:00:01 - 0.18
02/06/2008 11:10:01 - 0.03
02/06/2008 11:20:01 - 0.07
02/06/2008 11:30:01 - 0.03
$

명령어 결과형식을 HTML을 이용해 사용을 할수도 있는데요, 이 때는 Table tag를 사용을 해 만들면 됩니다.

아래 스크립트를 살펴 봅시다.

$ cat reportstats
#!/bin/bash
# parse capstats data into daily report
FILE=/home/rich/capstats.csv
TEMP=/home/rich/capstats.html
MAIL=`which mutt`
DATE=`date +"%A, %B %d, %Y"`
echo "‹html›‹body›‹h2›Report for $DATE‹/h2›" › $TEMP
echo "‹table border=\"1\"›" ›› $TEMP
echo "‹tr›‹td›Date‹/td›‹td›Time‹/td›‹td›Users‹/td›" ›› $TEMP
echo "‹td›Load‹/td›‹td›Free Memory‹/td›‹td›%CPU Idle‹/td›‹/tr›" ›› $TEMP
cat $FILE | gawk -F, ’{
printf "‹tr›‹td›%s‹/td›‹td›%s‹/td›‹td›%s‹/td›", $1, $2, $3;
printf "‹td›%s‹/td›‹td›%s‹/td›‹td›%s‹/td›\n‹/tr›\n", $4, $5, $6;
}’ ›› $TEMP
echo "‹/table›‹/body›‹/html›" ›› $TEMP
$MAIL -a $TEMP -s "Stat report for $DATE" rich ‹ /dev/null
rm -f $TEMP
$

결과값을 실행해 보면 아래와 같이 메일로 html 보고서를 받아 볼수 있습니다.

 

2. 백업 수행 하기

시스템 관리자로써 가장 중요한 일은 데이터를 보존 및 보관을 하는 일 입니다. 이를 위해 이번에는 백업과 관련된 내용을 살펴 보도록 하겠 습니다.

Archiving data file

작업 디렉토리를 snapshot으로 찍어 안전한 곳에 보관하는 것은 관리자로써 데이터를 보관하기 위해 유용 합니다. 이제 스크립트를 이용해 이를 자동으로 실행 되도록 만들어 보도록 하겠 습니다.

우선 필요한 작업을 나열을 해보면 아래의 순서와 같습니다.

1) tar명령을 이용해서 작업 디렉토리의 모든 파일을 하나의 파일로 생성

$ tar -cf archive.tar /home/rich/test 2› /dev/null

2)생성된 파일의 용량을 줄이기 위해 압축

$ gzip archive.tar

3) 아카이브 파일명을 이용해 유일한 파일명 생성하기

$ DATE=`date +%y%m%d`

$ FILE=tmp$DATE

$ echo $FILE

tmp080206

$

Daily Archive 스크립트 만들기.

일단위로 아카이브 파일을 만드는 스크립트를 살펴 보도록 합시다.

$ cat archdaily
#!/bin/bash
# archive a working directory
DATE=`date +%y%m%d`
FILE=archive$DATE
SOURCE=/home/rich/test
DESTINATION=/home/rich/archive/$FILE
tar -cf $DESTINATION $SOURCE 2› /dev/null
gzip $DESTINATION
$

위의 스크립트를 실행을 시켜보면 결과를 아래와 같이 볼 수 있습니다.

$ ./archdaily
$ ls -al /home/rich/archive
total 24
drwxrwxr-x 2 rich rich 4096 2008-02-06 12:50 .
drwx------ 37 rich rich 4096 2008-02-06 12:50 ..
-rw-rw-r-- 1 rich rich 3046 2008-02-06 12:50 archive080206.gz
$

Hourly Archive 스크립트 만들기

시간별로 아카이브 파일을 생성을 하다 보면 파일의 수가 너무 많아져서 관리를 하기가 힘이 듭니다. 이를 위해 아카이브 파일을 저장할 장소를 월/일/시간 별 구조로 만들어 관리를 하여야 합니다.

아래는 생성할 디렉토리 구조 입니다.

 

자 이제 위의 구조로 디렉토리도 생성을 하고 아카이브 파일도 저장할 수 있는 스크립트를 만들어 봅시다.

$ cat archhourly
#!/bin/bash
# archive a working directory hourly
DAY=`date +%d`
MONTH=`date +%m`
TIME=`date +%k%M`
SOURCE=/home/rich/test
BASEDEST=/home/rich/archive
mkdir -p $BASEDEST/$MONTH/$DAY
DESTINATION=$BASEDEST/$MONTH/$DAY/archive$TIME
tar -cf $DESTINATION $SOURCE 2› /dev/null
gzip $DESTINATION
$

위의 스크립트를 실행을 시켜 보면.

$ ./archhourly
$ ls -al /home/rich/archive/02/06
total 32
drwxrwxr-x 2 rich rich 4096 2008-02-06 13:20 .
drwxrwxr-x 3 rich rich 4096 2008-02-06 13:19 ..
-rw-rw-r-- 1 rich rich 3145 2008-02-06 13:19 archive1319.gz
$ ./archhourly
$ ls -al /home/rich/archive/02/06
total 32
drwxrwxr-x 2 rich rich 4096 2008-02-06 13:20 .
drwxrwxr-x 3 rich rich 4096 2008-02-06 13:19 ..
-rw-rw-r-- 1 rich rich 3145 2008-02-06 13:19 archive1319.gz
-rw-rw-r-- 1 rich rich 3142 2008-02-06 13:20 archive1320.gz
$

그럼 이번에는 아카이빙 파일을 메일로 보내는 스크립트를 만들어 보겠 습니다.

$ cat mailarch
#!/bin/bash
# archive a working directory and e-mail it out
MAIL=`which mutt`
DATE=`date +%y%m%d`
FILE=archive$DATE
SOURCE=/home/rich/test
DESTINATION=/home/rich/archive/$FILE
ZIPFILE=$DESTINATION.zip
tar -cf $DESTINATION $SOURCE 2› /dev/null
zip $ZIPFILE $DESTINATION
$MAIL -a $ZIPFILE -s "Archive for $DATE" rich@myhost.com ‹ /dev/null
$

자 그럼 이번 포스트를 마지막으로 Shell Script는 마치도록 하겠습니다.

부디 업무에 유용하게 활용 될수 있기를 빕니다.

그럼 다른 Post에서 다시 뵙겠 습니다 ~~~.

728x90
반응형

'쉘스크립트' 카테고리의 다른 글

E-Mail 사용하기  (1) 2022.07.06
Web 사용하기  (1) 2022.07.06
Database 이용하기  (0) 2022.07.06
Advance gawk  (0) 2022.07.06
진화된 sed  (1) 2022.07.06