블로그 이미지
.
속눈썹맨

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

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

shell script 작성팁

2004. 8. 17. 11:19 | Posted by 속눈썹맨
Reference
http://www.freeos.com/guides/lsst/
Unix Power tools PartVII(Chapter 44~47)


1. library, path에 관한 환경변수는 .bashrc 같은 것으로 입력하게 한다.
   (shell script 내부에 기술하지 말 것.)
   예) PATH, LD_LIBRARY_PATH
2. 기본적인 날짜, 시간, 메시지 등을 찍어주는 subroutine들을 만들어둔다.
   (module화의 기본)
3. 환경설정 파일, input, output, 임시 파일 경로등도 여러 scripts에서 쓴다면
    configure script 한곳에 모아 놓은 후 include한다.
   (shell script에서는 'source'라는 명령을 쓴다.)
4. 상대경로보다는 절대 경로를 쓴다.
5. parameter의 갯수와 이름을 반드시 체크한다.
   잘못된 입력에 대해서는 에러메시지와 usage를 출력한다.
   예) Usage : ./test.sh <filename> [<num>] ...
6. 주기적으로 실행될 때는 cron으로 돌린다.
7. 입력이 언제 들어올 지 모를 때는 cron으로 1~5분마다 돌린 후 입력 조건을 check한다.
   조건을 만족하지 않으면 종료한다.
8. cron으로 돌리거나 수동으로 돌릴 때 scripts가 중복실행되면 위험하므로 lock file을 만든다.
LOCK_FILE=/tmp/파일명.lock

if [ -f $LOCK_FILE ]; then
    echo "$0 already running"
    exit
fi
touch $LOCK_FILE
--- 여러가지 일을 처리 --------
rm -f $LOCK_FILE
9. 임시 디렉토리나 입출력 디렉토리는 없을 수도 있으므로 초기화 단계에서 만들어 준다.
    mkdir -p 디렉토리명
10. process의 각 과정에서 수행 종료 상태와 시간을 남긴다.
echo "시간 : 메시지" 등...


예제 코드)
#!/bin/sh
LANG=C

DATE=`date +20%y%m%d`
YEAR=`date +20%y`
WEEK=`date +%U`
WEEKDAY=`date +%w`
HOUR=`date +%H`
# HOUR3 = 3시간 단위로 나눈 시각.
# 0~2시 59분 => 0시
# 3~5시 59분 => 3시
# 6~8시 59분 => 6시
# 9~11시 59분 => 9시
# 12~14시 59분 => 12시
# 15~17시 59분 => 15시
# 18~20시 59분 => 18시
# 21~23시 59분 => 21시
HOUR3=`expr \( $HOUR / 3 \) \* 3`
HOUR03=`printf %02d $HOUR3`

DATE_1AGO=`date --date '1 days ago' +20%y%m%d`
YEAR_1AGO=`date --date '1 days ago' +20%y`
WEEK_1AGO=`date --date '1 days ago' +%U`
WEEKDAY_1AGO=`date --date '1 days ago' +%w`

DATE_7AGO=`date --date '7 days ago' +20%y%m%d`
YEAR_7AGO=`date --date '7 days ago' +20%y`
WEEK_7AGO=`date --date '7 days ago' +%U`
# data를 압축해서 복사할 때 이용
# Usage) gz_scp 디렉토리 파일명 대상서버(유저@서버) 디렉토리
# 복사시에 '파일명.gz.프로세스번호'로 복사되어
# 복사가 완료되면 '파일명.gz'으로 변경됨
function gz_scp {
    SRC_DIR=$1
    SRC_FILE=$2
    REMOTE_USER_AT_HOST=$3
    REMOTE_DIR=$4

    gzip -c $SRC_DIR/$SRC_FILE | ssh $REMOTE_USER_AT_HOST " cat - > $REMOTE_DIR/
$SRC_FILE.gz.$$"
    ssh $REMOTE_USER_AT_HOST "mv $REMOTE_DIR/$SRC_FILE.gz.$$ $REMOTE_DIR/$SRC_FI
LE.gz"
}

# 시간과 메시지를 찍을 때 이용
# script의 시작과 끝에 사용하면 수행시간 log를 남길 수 있어서 유용함
# 여러 process가 동시에 뜨는 환경이라면 log에 메시지와 함께 PID를 찍는 것이 좋다.
function print_time_msg {
    MSG=$*
    echo "`date +20%y.%m.%d_%H:%M:%S` [$$]: $MSG"
}

11. main function으로 감싸주면 c언어처럼 편하게 쓸 수 있다.
function main {
할 일
}

print_time_msg "script.sh start"
main
RET=$?
print_time_msg "script.sh end"
exit $RET