리눅스 셀 스크립트 배치 작성
리눅스에서 대표적인 스케쥴러로 crontab (크론탭) 이 있다. 일정 주기 특정 시간에 배치 프로그램을 실행시켜주는 프로그램이다.
기본적인 crontab (크론탭) 명령어
예약된 리스트를 살펴보는 명령어
crontab -l
실행해보니 현재 두개의 셀이 예약 되어있다.
새로운 스케쥴을 추가 혹은 편집 하는 명령어
crontab -e
이 예제는 매일 9시에 파일을 실행하도록 등록한것이다.
00 09 * * * /usr/local/batch/파일이름.sh >> /usr/local/batch/log/로그파일이름_
date "+\%Y-\%m-\%d \%H:\%M:\%S"
.log 2>&1
맨앞에 별 5개는 분 시간 일 월 년 각자 지정할수있다 * * * * * 로 지정하게 되면 매 1분마다 한번씩 실행하게 된다
밑의 명령어를 추가하여 지정한 배치의 로그 파일을 지정한 폴더의 파일 이름으로 생성하게 한다
>> /usr/local/batch/log/로그파일이름_
date "+\%Y-\%m-\%d \%H:\%M:\%S"
.log 2>&1
nano에디터에서 추가할때
작성후 Ctrl + o 저장하기 Enter Ctrl + x 나가기
간단한 배치를 작성하였는데 작성한 배치 Shell을 살펴보자
쉘을 통해 DB로 접속하여 SQL를 받기
변수 CMD_MYSQL 에 DB로 접속할수 있는 conf 파일을 따로 만들어 path를 지정해준다
CMD_MYSQL="mysql --defaults-extra-file=$ROOT_DIRECTORY/mysql.conf $MYSQL_SCHEMA -N"
따로 작성한 DB접속용 conf 파일 (파일이름은 mysql.conf 이다)
[client]
user=DB접속아이디
password=DB접속비번
host=디비주소
쉘 배열의 길이 구하기(length)
bash 에서 배열의 길이 구하는 것은 아래와 같다 ${#array_name[@]} 또는 ${#array_name[*]}
array_length=${#array[@]}
echo "ID는$array_length 件입니다"
쉘 배열 길이만큼 For 문
어레이의 길이 만큼 for 문을 통해 실행하게 한다
for element in ${array[@]}; do
echo "POST:ID=${element}, key=$i"
curl -X POST -d -d $i=${element} http://localhost/api/post
i=`expr $i + 1`
done
cURL을 통해 파라미터 설정하여 POST 통신 하기
-d 키=벨류 옵션을 통해 파라미터를 설정할수 있다.
curl -X POST -d $i=${element} http://localhost/api/post
작성한 전체 쉘 스크립트
#!/bin/bash
echo "[INFO] 処理開始"
echo "------------------------------------------------------"
# 定数の定義
MYSQL_SCHEMA="접속할DB스키마이름"
ROOT_DIRECTORY="/usr/local/batch"
CMD_MYSQL="mysql --defaults-extra-file=$ROOT_DIRECTORY/mysql.conf $MYSQL_SCHEMA -N"
# SQLの指定
SELECT_QUERY="
SELECT do.id
FROM dtb_aa AS do
INNER JOIN dtb_bb AS ds ON do.id = ds.id
WHERE do.id IN (4,6)
GROUP BY id
"
# シェルを実行。
result=`echo ${SELECT_QUERY} | ${CMD_MYSQL}`
if [[ $? -eq 0 ]]; then
array=(${result})
i=0
array_length=${#array[@]}
echo "対象IDは$array_length件です。"
for element in ${array[@]}; do
echo "POST通信:ID=${element}, key=$i"
curl -X POST -d -d $i=${element} http://localhost/api/post
i=`expr $i + 1`
done
else
echo "SQL取得を失敗しました。"
fi
echo "-----------------------------------------------------"
echo "[INFO] 処理終了"