Я нашел функцию bash, которая позволяет мне повторять команды.
function retry {
local n=1
local max=50
local delay=1
while true; do
"$@" && break || {
if [[ $n -lt $max ]]; then
((n++))
echo "[$n/$max] ($?) $@:" >&2
sleep $delay;
else
fail "The command has failed after $n attempts."
fi
}
done
}
function fail {
echo $1 >&2
exit 1
}
Я использую это следующим образом
$ retry ping -q -c 1 $ip
Однако, при повторной попытке команд я никогда не хочу видеть команды stderr или вывод stdout. Как я могу заставить команду замолчать при повторной попытке?
Если вы хотите отключить все выходные данные команды , выполняемой функцией retry
, измените
"$@" && break || {
на:
"$@" &>/dev/null && break || {
в сценарий или просто дать его вместе с аргументом, например:
retry "ping -q -c 1 $ip &>/dev/null"
Если вы, однако, хотите отключить весь вывод всей функции , либо закомментируйте каждый echo
в вашем скрипте и внесите изменения, описанные выше, или добавьте &>/dev/null
в командную строку, например:
retry ping -q -c 1 $ip &>/dev/null
Я тестирую на bsd / macos, похоже, это работает. Другой ответ не сработал. Я предполагаю, что это также сработало бы в моей производственной среде Ubuntu.
function retry {
local n=1
local max=50
local delay=1
echo contained "$@"
while true; do
eval "$*" &>/dev/null && break || {
foo=$?
if [[ $n -lt $max ]]; then
((n++))
echo "[$n/$max] ($foo) $@" >&2
sleep $delay;
else
fail "The command has failed after $n attempts."
fi
}
done
}
retry "ping -q -c 1 $ip"