리눅스 배치 파일 작성

Linuxシェルスクリプトでバッチを作成する方法

Linuxセルスクリプトのバッチ作成

Linuxで代表的なスケジューラとして crontab(クローンタブ) がある。 特定の時間にバッチプログラムを一定周期に実行させる。

基本的な crontab(クローンタブ) コマンド

予約済みリストを調べるコマンド

crontab -l

実行してみると、現在2つのセルが予約されている。

新しいスケジュールを追加または編集するコマンド

 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分ごとに1回実行されます。

下のコマンドを追加して、指定したバッチのログファイルを指定したフォルダのファイル名で生成させる

 /usr/local/batch/log/ログファイル名_`date "+\%Y-\%m-\%d \%H:\%M:\%S"`.log 2>&1

nanoエディタで追加するとき

  1. 作成後
  2. Ctrl+oを保存する
  3. Enter
  4. Ctrl+x 終了

簡単な配置を作成しました。 作成したバッチシェルを見てみましょう。


シェルを介して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接続ID
password=DB接続PW
host=DB住所

シェル配列の長さを取得する

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のSCHEMA名"
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] 処理終了"