스크립트가 다른 세션에서 동시에 실행될 때 while 루프를 종료하는 중 오류가 발생했습니다.

스크립트가 다른 세션에서 동시에 실행될 때 while 루프를 종료하는 중 오류가 발생했습니다.

두 가지 다른 스크립트가 있습니다: A1.shA2.sh. 이는 다양한 애플리케이션에 대한 미들웨어 서비스를 시작하는 데 사용됩니다. 즉, A1.sh하나의 응용 프로그램 서비스를 시작하고 A2.sh다른 응용 프로그램 서비스를 시작합니다. 동일한 호스트(AIX)에서 실행됩니다.

서비스가 시작되는 데 약간의 시간(약 7~15분)이 걸리기 때문에 두 스크립트 모두에 다음 기능이 있습니다. 로그를 확인하고 서비스가 시작될 때까지 기다리거나, 해당 시간 내에 서비스가 시작되지 않으면 1000초 후에 시간 초과됩니다. 이 스크립트를 순서대로 실행하면 제대로 작동합니다. 그러나 A1.sh한 세션에서 스크립트를 실행하고 다른 세션(동일한 호스트)을 열고 A2.sh스크립트를 실행하면 서비스가 백그라운드에서 실행 중이더라도 스크립트 중 하나가 시간 초과로 인해 실패합니다. 이 시간 초과는 올바르지 않습니다. 즉, 아직 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이 다릅니다. 아래와 같이 스크립트 중 하나가 실패합니다.

<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을 사용해 보십시오 .

관련 정보