수정.sh

수정.sh

Dummy.sh데이터를 로드하고 fix.sh문제가 있는 데이터를 수정한 후 다시 로드하는 사용 사례가 있습니다 . 여기서 수정 스크립트가 3번의 시도로 문제를 해결할 수 없는 경우 재시도 논리를 구현해야 합니다.

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

누군가 내 실수를 정확히 지적하거나 다른 해결책을 제안해 주실 수 있나요?

더미.sh

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

수정.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

OS : 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를 변경할 수 있으므로).

수정.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동일하게 작동합니다. 만약 너라면하다파일이 필요합니다.나중에 청소하는 것이 더 나을 수도 있습니다.

관련 정보