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
있으며 동일한 방식으로 작동합니다. 만약 너라면하다이 파일은 필수입니다. 참고하세요.덫나중에 청소하는 것이 더 나을 수도 있습니다.