실행을 최대 5번까지 계속 재시도하려면 스크립트에 재시도 논리를 어떻게 작성해야 합니까?

실행을 최대 5번까지 계속 재시도하려면 스크립트에 재시도 논리를 어떻게 작성해야 합니까?

다음 조건에 따라 15초 후에 최대 5번 실행을 재시도하는 논리를 쉘 스크립트에 작성하고 싶습니다."상태 코드=실패"몇 가지 문제로 인해 실패하는 경우.

답변1

for i in 1 2 3 4 5; do command && break || sleep 15; done

"command"를 원하는 명령으로 바꾸세요. 이는 "상태 코드 = 실패"가 0이 아닌 반환 코드를 의미한다고 가정합니다.


다양성:

구문을 사용하십시오 {..}. 대부분의 쉘에서는 작동하지만 BusyBox에서는 작동하지 않습니다 sh.

for i in {1..5}; do command && break || sleep 15; done

seq실패한 명령의 종료 코드를 사용 하고 전달하십시오.

for i in $(seq 1 5); do command && s=0 && break || s=$? && sleep 15; done; (exit $s)

위와 동일하지만 sleep 15최종 실패 후 건너뛰었습니다. 최대 루프 수를 한 번만 정의하는 것이 가장 좋으므로 루프 시작 부분에서 휴면을 수행하면 됩니다 i > 1.

for i in $(seq 1 5); do [ $i -gt 1 ] && sleep 15; command && s=0 && break || s=$?; done; (exit $s)

답변2

스크립트는 카운터를 사용하여 n명령 시도 횟수를 5회로 제한합니다. 명령이 성공하면 break루프가 종료됩니다.

n=0
until [ "$n" -ge 5 ]
do
   command && break  # substitute your command here
   n=$((n+1)) 
   sleep 15
done

답변3

function fail {
  echo $1 >&2
  exit 1
}

function retry {
  local n=1
  local max=5
  local delay=15
  while true; do
    "$@" && break || {
      if [[ $n -lt $max ]]; then
        ((n++))
        echo "Command failed. Attempt $n/$max:"
        sleep $delay;
      else
        fail "The command has failed after $n attempts."
      fi
    }
  done
}

예:

retry ping invalidserver

다음 출력을 생성합니다.

ping: unknown host invalidserver
Command failed. Attempt 2/5:
ping: unknown host invalidserver
Command failed. Attempt 3/5:
ping: unknown host invalidserver
Command failed. Attempt 4/5:
ping: unknown host invalidserver
Command failed. Attempt 5/5:
ping: unknown host invalidserver
The command 'ping invalidserver' failed after 5 attempts

복잡한 명령을 사용하는 실제 작업 예는 다음을 참조하세요.이 스크립트.

답변4

재시도 기능입니다

function retry()
{
        local n=0
        local try=$1
        local cmd="${@: 2}"
        [[ $# -le 1 ]] && {
        echo "Usage $0 <retry_number> <Command>"; }

        until [[ $n -ge $try ]]
        do
                $cmd && break || {
                        echo "Command Fail.."
                        ((n++))
                        echo "retry $n ::"
                        sleep 1;
                        }

        done
}

retry $*

산출:

[test@Nagios ~]$ ./retry.sh 3 ping -c1 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.207 ms

--- localhost ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.207/0.207/0.207/0.000 ms

[test@Nagios ~]$ ./retry.sh 3 ping -c1 localhostlasjflasd
ping: unknown host localhostlasjflasd
Command Fail..
retry 1 ::
ping: unknown host localhostlasjflasd
Command Fail..
retry 2 ::
ping: unknown host localhostlasjflasd
Command Fail..
retry 3 ::

관련 정보