我发现了一个 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 输出。如何在重试时让命令静音?
答案1
如果你想让所有输出都静音命令由函数执行retry
,改变
"$@" && break || {
到:
"$@" &>/dev/null && break || {
在脚本中或简单地将其与参数一起提供,例如:
retry "ping -q -c 1 $ip &>/dev/null"
但是如果你想要静音所有输出整个功能,要么注释掉echo
脚本中的每一行并执行上面解释的更改,要么&>/dev/null
在命令行上附加,例如:
retry ping -q -c 1 $ip &>/dev/null
答案2
我在 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"