次の条件に従って、15秒後に最大5回の実行を再試行するロジックをシェルスクリプトに書きたいと思います。「ステータスコード=失敗」いくつかの問題が原因で失敗した場合。
答え1
for i in 1 2 3 4 5; do command && break || sleep 15; done
"command"を希望のコマンドに置き換えます。これは、「状態コード=失敗」がゼロ以外の戻りコードを意味すると仮定する。
多様性:
構文を使用してください{..}
。ほとんどのシェルでは機能しますが、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 ::