2つの異なるスクリプトがあります:A1.sh
とA2.sh
。これは、さまざまなアプリケーションのミドルウェアサービスを開始するために使用されます。つまり、A1.sh
あるアプリケーションサービスを起動し、A2.sh
別のアプリケーションサービスを起動します。同じホスト(AIX)で実行されます。
サービスの開始には少し時間(約7〜15分)かかるため、両方のスクリプトに次の機能があります。ログを確認してサービスが開始されるのを待つか、その時間内にサービスが開始されない場合は、1000秒後にタイムアウトします。このスクリプトを順番に実行すると正常に動作します。ただしA1.sh
、あるセッションでスクリプトを実行し、別のセッション(同じホスト)を開き、スクリプトを実行すると、A2.sh
サービスがバックグラウンドで実行されていても、スクリプトの1つがタイムアウトのために失敗します。このタイムアウトは正しくありません。つまり、まだ1000秒が経過していません。以下はコードです
### wait_for_log
### This wait for a goal message on a specified log, if this is't found the message
### for a timeout period trigger a error message on script log.
###
### usage: wait_for_log [ log_name ] [ start | stop ] [ app_name ] [ timeout ] [ goal_message ]
wait_for_log() {
FILE_NAME=$1
ACTION=$2
APP_NAME=$3
GOAL_MESSAGE=$5
GOAL_MESSAGE2=$6
TIMEOUT=$4
ELAPSED_TIME=0
START_TIME=$SECONDS
alert "info" "${ACTION^^} ${APP_NAME^^}"
alert "info" "Waiting for ${APP_NAME} ${ACTION}." -n
tail -0lf $FILE_NAME | while read -t $TIMEOUT LOGLINE
do
echo -n "."
if [ ! -z "$GOAL_MESSAGE2" ]; then
if [[ "${LOGLINE}" == *$GOAL_MESSAGE2* ]]; then
ps -ef | grep "[t]ail " | awk {'print $2'} | xargs kill
return 2
fi
fi
if [[ "${LOGLINE}" == *$GOAL_MESSAGE* ]]; then
ps -ef | grep "[t]ail " | awk {'print $2'} | xargs kill
return 2
fi
done
EXIT_CODE=$?
ELAPSED_TIME=$(($SECONDS - $START_TIME))
if [ $EXIT_CODE -eq 2 ];then
printf "\e[1;32m[OK]\e[0m\n"
alert "success" "${APP_NAME} took ${ELAPSED_TIME}s to ${ACTION}."
GLOBAL_ELAPSED_TIME=$((GLOBAL_ELAPSED_TIME + ELAPSED_TIME))
RETVAL=0
return 0
fi
printf "\e[1;31m[FAIL]\e[0m\n"
alert "error" "${APP_NAME} ${ACTION} failure, exceed the ${ELAPSED_TIME}s timeout to ${ACTION}."
RETVAL=1
exit_script $ACTION
}
両方のスクリプトのFILE_NAMEが異なります。次のようにスクリプトの1つが失敗します。
<Info> START RPM
Inside wait for log proc, recieved r2TIMEOUT value: 1000
<Info> STARTING NODEMANAGER
<Info> Waiting for NodeManager starting..[FAIL]
<Error> NodeManager starting failure, exceed the 6s timeout to starting.
<Error> Ocurred an ERROR when RPM trying to starting.
同時に実行されたときにwhileループにどのような問題があるのかご存知ですか?
答え1
私の考えでは、「tail」出力のgrepがps
理由になるようです。$FILE_NAME
誤って他のスクリプトテールプロセスを終了せずに正しく繰り返されるプロセスを終了するには、grepを使用してみてください。