두 가지 다른 스크립트가 있습니다: A1.sh
및 A2.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을 사용해 보십시오 .