【发布时间】:2020-02-27 16:10:24
【问题描述】:
我正在尝试构建一个通用的retry shell 函数,以便在上次失败时重新运行指定的 shell 命令几次,这是我的代码:
retry() {
declare -i number=$1
declare -i interrupt=0
trap "echo Exited!; interrupt=1;" SIGINT SIGTERM SIGQUIT SIGKILL
shift
for i in `seq $number`; do
echo "\n-- Retry ${i}th time(s) --\n"
$@
if [[ $? -eq 0 || $interrupt -ne 0 ]]; then
break;
fi
done
}
它适用于wget、curl 和其他各种常用命令。但是,如果我运行
retry 10 rsync local remote
,在传输过程中发送一个ctrl+c中断它,它会报告
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(700) [sender=3.1.3]
似乎rsync 抑制了内部的 SIGINT 和其他一些相关信号,然后将代码 20 返回给外部调用者。这个返回码没有使循环中断,然后我发送了几个 ctrl+c 来中断下一个rsync 命令。它只为最后一个 ctrl+c 打印 Exited! 并且 trap 捕获它。
问题:
为什么它首先返回代码 20 没有使循环中断?
如何让
trap捕捉到SIGINT信号而rsync,如果没有,我该怎么办?
【问题讨论】:
-
当 rsync 以 20 失败时,您已经知道它无论如何“失败”了,它不会影响您的重试逻辑。那为什么重要呢?
-
我想在按下ctrl+c时立即终止命令并退出循环,不管子命令是什么。 @P.P
-
有道理。我已经发布了一个解决方案,应该可以按照您的意愿工作。
标签: bash shell signals rsync bash-trap