로그 백업을 위하여 crontab에 등록할 Bash Shell를 작업하려 한다. 익혀간 과정을 적어보자
1) Backup 가정
- 3일전 로그를 압축한다.
- 여러개의 로그파일이 다양한 위치에 존재한다
- 압축된 로그파일은 년/월 별도 디렉토리로 이동하여 관리한다
- 작은 업무 시스템별로 로그의 위치가 틀리다 (단, 작은 업무 시스템안에 디렉토리는 고정임)
2) 3일전 로그찾기
- 몇일전 날짜를 찾는 문법 (참조)
####################################################
# 1) output is 3 days ago
# backup directory name : backup_YYYY-MM in log files
# 3일전 파일을 찾는다
YYYYMMDD=`date +%Y%m%d --date '3 days ago'`
DATE="${YYYYMMDD:0:4}-${YYYYMMDD:4:2}-${YYYYMMDD:6:2}"
BK_DIR="backup_${YYYYMMDD:0:4}-${YYYYMMDD:4:2}"
GZIP_CNT="0"
echo ""
echo "===============================[Backup Start]============================="
echo "<< Start Time: "`date '+%F %r'`" >>"
echo "-- Backup File Date : $DATE, Backup Dir : $BK_DIR"
3) 여러개의 로그파일이 다양한 위치에 존재함
- 지정한 디렉토리에 파일이 있으면 gzip으로 압축한다
####################################################
# 2) run gzip for log files
# ${1} : directory full path
# ${2} : file name
function mkdir_function()
{
if [ ! -d ${1} ]; then
echo " make dir : ${1}"
mkdir ${1}
fi
}
# backup_YYYY-MM 디렉토리가 없으면 만들고 .gz 압축파일을 월별로 관리한다
function mv_file_function()
{
mkdir_function "${1}/$BK_DIR"
echo " move : ${1}/${2}.gz to ${1}/$BK_DIR"
mv ${1}/${2}.gz ${1}/$BK_DIR/
}
# ${1} : directory full path
# ${2} : file name
# 지정된 파일만 압축
function gzip_function()
{
if [ -e ${1}/${2} ]; then
cd "${1}"
echo " gzip : ${1}/${2}"
gzip ${1}/${2}
mv_file_function "${1}" "${2}"
GZIP_CNT=`expr $GZIP_CNT + 1`
fi
}
# for time loop gzip
# 3일 이전의 모든 파일들
function gzip_loop_function()
{
cd "${1}"
for file in `find -type f -mtime +3`; do
local FNAME="${file:2}"
local EXT="${FNAME##*.}"
if [ "$EXT" != "" ] && [ "$EXT" != "gz" ] && [ "$EXT" != "sh" ]; then
gzip_function "${1}" "${FNAME}"
fi
done
}
4) 업무 단위 시스템별로 로그의 위치 지정 : 로그 지정하여 압축 수행함
echo "-- [START] ${JDOMAIN} backup : TX.xml & Error.xml log"
gzip_function "/tmp/logs" "Transactions.log.$DATE"
gzip_function "/tmp/logs" "Error.log.$DATE"
# gc old log
echo "-- [START] ${JDOMAIN} backup : old gclog log"
gzip_loop_function "/tmp/logs/$JDOMAIN/old/gclog"
# nohup old log
echo "-- [START] ${JDOMAIN} backup : old nohup log"
gzip_loop_function "/tmp/logs/$JDOMAIN/old/nohup"
5) 전체 Shell Script
#!/bin/bash | |
#################################################### | |
# | |
# This is backup shell for the WAS Server Logs | |
# author : yun young sik, yuwon system | |
# blog : http://mobicon.tistory.com | |
# date : 2013.02.20 | |
# | |
#################################################### | |
#################################################### | |
# 1) output is 3 days ago | |
# backup directory name : backup_YYYY-MM in log files | |
YYYYMMDD=`date +%Y%m%d --date '3 days ago'` | |
DATE="${YYYYMMDD:0:4}-${YYYYMMDD:4:2}-${YYYYMMDD:6:2}" | |
BK_DIR="backup_${YYYYMMDD:0:4}-${YYYYMMDD:4:2}" | |
GZIP_CNT="0" | |
echo "" | |
echo "===============================[Backup Start]=============================" | |
echo "<< Start Time: "`date '+%F %r'`" >>" | |
echo "-- Backup File Date : $DATE, Backup Dir : $BK_DIR" | |
#################################################### | |
# 2) run gzip for log files | |
# ${1} : directory full path | |
# ${2} : file name | |
function mkdir_function() | |
{ | |
if [ ! -d ${1} ]; then | |
echo " make dir : ${1}" | |
mkdir ${1} | |
fi | |
} | |
function mv_file_function() | |
{ | |
mkdir_function "${1}/$BK_DIR" | |
echo " move : ${1}/${2}.gz to ${1}/$BK_DIR" | |
mv ${1}/${2}.gz ${1}/$BK_DIR/ | |
} | |
# ${1} : directory full path | |
# ${2} : file name | |
function gzip_function() | |
{ | |
if [ -e ${1}/${2} ]; then | |
cd "${1}" | |
echo " gzip : ${1}/${2}" | |
gzip ${1}/${2} | |
mv_file_function "${1}" "${2}" | |
GZIP_CNT=`expr $GZIP_CNT + 1` | |
fi | |
} | |
# for time loop gzip | |
function gzip_loop_function() | |
{ | |
cd "${1}" | |
for file in `find -type f -mtime +3`; do | |
local FNAME="${file:2}" | |
local EXT="${FNAME##*.}" | |
if [ "$EXT" != "" ] && [ "$EXT" != "gz" ] && [ "$EXT" != "sh" ]; then | |
gzip_function "${1}" "${FNAME}" | |
fi | |
done | |
} | |
#################################################### | |
# 3) get system name | |
# 호스트명칭에 따라서 백업파일의 위치가 틀리다. | |
HNAME="$(hostname)" | |
JDOMAIN="" | |
# prefix p=real, t=test | |
if [ $HNAME == "hostname2" ] || [ $HNAME == "hostname2" ]; then | |
JDOMAIN="xxxxDomain" | |
elif [ $HNAME == "hostname3" ]; then | |
JDOMAIN="yyyyDomain" | |
# Unknown Domain (error) | |
else | |
JDOMAIN="unknown" | |
fi | |
echo "-- HostName : $HNAME, JbossDomainName : $JDOMAIN" | |
echo "" | |
############################################################ | |
# 4) Gzip files | |
# These systems have the same log policy. | |
# xxxxDomain | |
if [ $JDOMAIN != "unknown" ] && [ $JDOMAIN != "hostname2" ] && [ $JDOMAIN != "hostname2" ]; then | |
# Gzip about /tmp/logs/Transaction.log.[before 3days], Error.log.[before 3days] | |
# ex) /tmp/logs/Transaction.log.2013-01-05, /tmp/logs/Error.log.2013-01-05 | |
echo "-- [START] ${JDOMAIN} backup : TX.xml & Error.xml log" | |
gzip_function "/tmp/logs" "Transaction.log.$DATE" | |
gzip_function "/tmp/logs" "Error.log.$DATE" | |
# gc old log | |
echo "-- [START] ${JDOMAIN} backup : old gclog log" | |
gzip_loop_function "/tmp/logs/$JDOMAIN/old/gclog" | |
# nohup old log | |
echo "-- [START] ${JDOMAIN} backup : old nohup log" | |
gzip_loop_function "/tmp/logs/$JDOMAIN/old/nohup" | |
# yyyyDomain | |
# The YYYY system has the different log policy from others | |
elif [ $JDOMAIN == "hostname3" ]; then | |
echo "-- [START] yyyyDomain backup : Transaction.log & Error.log files" | |
for ix in 1 2 3 4; do | |
gzip_function "/tmp/logs" "${JDOMAIN}${ix}_Transaction.log.$DATE" | |
gzip_function "/tmp/logs" "${JDOMAIN}${ix}_Error.log.$DATE" | |
done | |
fi | |
# Message print out | |
# echo success or fail | |
echo "" | |
if [ $JDOMAIN != "unknown" ]; then | |
if [ $GZIP_CNT -gt 0 ]; then | |
echo "-- [SUCCESS] Backup log [$GZIP_CNT] files!" | |
else | |
echo "-- [SUCCESS] There is no backup log files." | |
fi | |
else | |
echo "-- [FAIL] Unknown [$HNAME] hostname, check hostname!" | |
fi | |
echo "================================[Backup End]==============================" | |
echo "" |
<참조>
- 백업받을 디렉토리를 만들어야 하는 경우 : 하기 내용은 function을 이용한 참조 내역임 (다른 유사 참조)
- Bash Shell 문법을 익혀보자 (참조)
- Bash Shell 문법 : 옵션 잘 설명됨 (참조)
'Middleware, Cloud > Linux' 카테고리의 다른 글
[Linux] CPU 갯수 알아내기 (0) | 2013.02.07 |
---|---|
[Linux] 현재 공동작업하는 사람이 무얼하는지 알고 싶을 경우 (0) | 2013.01.11 |
[Linux] Free Memory 사이즈 알기 (0) | 2012.12.07 |
[Linux] Ubuntu 에 Maven 2 설치 (0) | 2012.11.23 |
[Linux] vsftpd 설치하기 (0) | 2012.11.21 |