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