Tomcat起動時のシェルスクリプト

Linux

さて今回のネタですが、便利なシェルスクリプトのご紹介です。

ちなみにこいつは職場でランチの帰りにお店の前で堂々と寝ていた猫です。

JenkinsとかでTomcatにアプリをデプロイして再起動とかやろうとするとアプリの起動完了前にジョブが終了してしまって困ることがあるかと思います。

Sleepを入れてとかの対応もありますが、アプリが肥大化して起動時間が増えるたびに秒数を調整とかはやりたくありませんよね?w
そんな時に便利なのがexpectコマンドです。

コマンドがインストールされていないこともあるので、
その場合はyum install expectでインストールしてください。

本来はSSHログインとか対話型のコマンドを自動実行する用途なのですが
起動持のログファイルを監視して、特定の文字列が出力されるまで待機するという使い方ができます。

使い方はコマンドラインでのやり方とスクリプトファイルを用意してそれを指定することもできます。
まぁ通常は面倒なので、コマンドラインで実行するのが多いですかね。。

基本的には

expect -c {
  set timeout 秒数
  spawn 実行するコマンド
  expect 監視する文字列 {文字列が出現した場合の処理} timeout {タイムアウトした場合の処理}
}

こんな感じになります。
これを使ってTomcatの起動時にcatalina.outを監視して、起動完了時に出力される文字列が出たら正常終了とすれば判定ができると思います。

んで、その処理を共通的に使えるシェルスクリプトにしたのが以下です。

#!/bin/bash
# settings
CHECK_TIMEOUT=600;
CMDNAME=`basename $0`
if [ $# -ne 3 ]; then
  echo "Usage: ${CMDNAME} [EXECOMMAND] [CHECK_LOG] [CHECK_WORD]" 1>&2
  exit 1
fi
EXECOMMAND=$1
CHECK_LOG=$2
CHECK_WORD=$3
# CheckFile
if [ ! -f $CHECK_LOG ]; then
  echo "${CHECK_LOG} Not Found."
  exit 1
fi
# execute
${EXECOMMAND}
expect <<EOF
set timeout ${CHECK_TIMEOUT}
spawn tail -f --lines=1 ${CHECK_LOG}
expect "${CHECK_WORD}" {
  puts "CHECK WORD OK."
  exit 0
} timeout {
  puts "TIMEOUT."
  exit 1
}
EOF
RC=$?
if [ ${RC} != 0 ]; then
  exit ${RC}
fi
exit 0

Tomcat起動持の使い方は
第1引数:’/etc/init.d/tomcat start’
第2引数:’/var/log/tomcat/catalina.out’
第3引数:’Server startup’
になります。

今のところTomcat以外の用途が思いつかないのでシェルスクリプト化した意味があまりないかもれませんが。。(笑)
service tomcat start したらすぐにOK返って困るという方はぜひ使ってみてください。

コメント

タイトルとURLをコピーしました