スクリプトが別のセッションで同時に実行されたときにwhileループを終了中にエラーが発生しました。

スクリプトが別のセッションで同時に実行されたときにwhileループを終了中にエラーが発生しました。

2つの異なるスクリプトがあります:A1.shA2.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を使用してみてください。

関連情報