리눅스 배치 파일 작성

리눅스 셀 스크립트로 배치 작성하는 법

리눅스 셀 스크립트 배치 작성

리눅스에서 대표적인 스케쥴러로 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] 処理終了"