다음 조건에 따라 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 ::