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
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