고치다

고치다

Dummy.sh데이터를 로드하고 fix.sh문제가 있는 데이터를 수정한 다음 다시 데이터를 로드하는 사용 사례가 있습니다 . 복구 스크립트가 3번의 시도 이내에 문제를 해결하지 못하는 경우 재시도 논리를 구현해야 합니다.

그러나 한 스크립트가 무한 루프에서 다른 스크립트를 호출하는 재귀 호출이 발생합니다.

누구든지 내 오류를 지적하거나 다른 해결책을 제안할 수 있습니까?

dummy.sh

#!/bin/bash -x
echo "Load data"
/home/user/etc/fix.sh

고치다

#!/bin/bash -x

TEMCOUNTER_TMP=FILE_NAME"_tmp6"

RETRY_C=0

echo $RETRY_C > $TEMCOUNTER_TMP

RETRY_LOGIC=`cat /home/user/etc/$TEMCOUNTER_TMP`
echo $RETRY_LOGIC

while [ $RETRY_LOGIC -le 3 ]
do
/home/user/etc/Dummy.sh
RETRY_LOGIC=`expr $RETRY_LOGIC + 1`
echo $RETRY_LOGIC > $TEMCOUNTER_TMP

done

운영 체제: SunOS 5.10 Generic_144488-06 sun4u sparc SUNW, Sun-Fire-V210

추신: 호출 이외의 Dummy.sh에서는 어떤 논리도 구현할 수 없습니다.fix.sh

답변1

여기에는 몇 가지 문제가 있습니다. 기본적으로 두 개의 루프를 반복합니다. 하나는 내부 fix.sh(while 루프 사용)이고 콜백을 통해 다시 반복됩니다 dummy.sh. 또한 처음부터 카운터 파일을 0으로 재설정하므로 fix.sh계산되지 않습니다. 역방향으로 주문할 수도 있으므로 dummy.sh카운터를 증가시키기 전에 (재귀) 호출이 발생합니다.

재귀적 동작만 원한다고 가정합니다(dummy.sh를 변경할 수 있으므로).

고치다

#!/bin/bash -x

TEMCOUNTER_TMP=/home/user/etc/FILE_NAME"_tmp6"

RETRY_LOGIC=`cat $TEMCOUNTER_TMP`
echo $RETRY_LOGIC

# Does RETRY_LOGIC have a value?
if [ -z "$RETRY_LOGIC" ]
then
    RETRY_LOGIC=0
    echo 0 > $TEMCOUNTER_TMP
fi

# Try to apply fix
[ $((RANDOM %3)) = 0 ]

# Did it work?
if [ $? = 0 ]
then
    echo "Success!"
    rm $TEMCOUNTER_TMP
    exit
fi

if [ $RETRY_LOGIC -le 3 ]
then
    export RETRY_LOGIC=`expr $RETRY_LOGIC + 1`
    echo $RETRY_LOGIC > $TEMCOUNTER_TMP
    echo "Retrying..."
    /home/user/etc/Dummy.sh
else
    echo "Giving up"
    rm $TEMCOUNTER_TMP
fi

또한 경로를 다시 확인하세요. TEMCOUNTER_TMP변수 접두사는 한 곳에만 붙였습니다./home/user/etc/

참고하시기 바랍니다,export이 명령은 $RETRY_LOGIC후속 시도에서 사용할 수 있으므로 변수가 다른 곳에서 사용되지 않는 한 참조된 모든 줄을 삭제할 수 TEMCOUNTER_TMP있으며 동일한 방식으로 작동합니다. 만약 너라면하다이 파일은 필수입니다. 참고하세요.나중에 청소하는 것이 더 나을 수도 있습니다.

관련 정보