코드 루프를 함수로 변환

코드 루프를 함수로 변환

20초 간격으로 5번 명령을 재시도하고 싶습니다. 이 명령을 메소드 매개변수로 전달하고 싶습니다. 어떻게 하나요? 함수가 작성되면 값을 함수에 어떻게 전달합니까?

현재 코드를 매개변수 세트가 있는 함수로 변환하고 싶습니다. 쉘 스크립트에서 이 함수를 어떻게 작성하고 호출합니까?

내 현재 코드는 다음과 같습니다.

  trialNumber=0
    until [ $trialNumber -ge 5]  
     do
        ssh $USERID@$HOST $SCRIPT_LOCATION/runme.sh   # This line is my command and it may very with number of parameters or command itself.
       [ $? -eq 0 ] && break
      trialNumber=$[$trialNumber+1]
      sleep 20
   done

(위의 코드는 여러 곳에 삽입되어 있는데 이를 함수로 옮기고 싶습니다.)

답변1

retry() {
  trialNumber=$1 delay=$2; shift 2
  while [ "$trialNumber" -gt 0 ]; do
    "$@" && return
    ret=$?
    sleep "$delay"
    trialNumber=$(($trialNumber - 1))
  done
  return "$ret"
}

retry 5 20 ssh "$USERID@$HOST" "$SCRIPT_LOCATION/runme.sh"

마지막 것은 sleep실패할 경우를 대비해 불필요하지만. 다음과 같은 것이 더 나을 수도 있습니다:

retry() {
  trialNumber=$1 delay=$2; shift 2
  until "$@"; do
    ret=$?
    trialNumber=$(($trialNumber - 1))
    [ "$trialNumber" -gt 0 ] || return "$ret"
    sleep "$delay"
  done
}

답변2

재시도 명령을 사용하십시오.

~$ retry --times 5 --delay 20 -- ssh $USERID@$HOST $SCRIPT_LOCATION/runme.sh

https://github.com/minfrin/retry

최신 Debian, Ubuntu 및 Nix와 함께 즉시 사용할 수 있습니다.

관련 정보