重试使用 xargs 运行的失败命令

重试使用 xargs 运行的失败命令

我有一个脚本,使用 xargs 和 rsync 守护进程模式并行 rsync 文件。由于源上发生写入,我偶尔会遇到 rsync 错误。如果有任何错误,我希望能够重试 rsync。我以为这会起作用,但使用分号似乎会破坏它。还有其他方法可以做到这一点吗?

find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I % until rsync -am %/ $host::%/; do echo "TRY AGAIN"; done ./rsync_retry.sh: line 21: syntax error near unexpected token `do'

答案1

使用 GNU Parallel 你可以执行以下操作:

find ./ -mindepth 1 -maxdepth 1 -type d | parallel --retries 3000  rsync -am {}/ $host::{}/

答案2

只需剪切并粘贴一些内容,然后放在开始处......

until find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I % rsync -am %/ $host::%/
do
    echo "TRY AGAIN"
done

这将运行 find...|xargs... 直到它返回 true。


要仅在失败的单个目录上运行 rsync,只需要一个目录的 rsync,没有 xargs,并尝试拆分查找和测试/循环(如果目录名称中有换行符或奇怪字符可能会失败):

for dir in $( find ./path -mindepth 1 -maxdepth 1 -type d )
do
    until rsync -am %/ $host::%/ $dir   # Or replace with whatever single dir rsync works best for you
    do
        echo "TRY AGAIN"
        sleep 2
     done
done

下一个可能是您正在等待的答案,让 xargs 多次调用一个函数,然后该函数执行“如果失败则重试”部分:

doitright(){
until rsync -am "$@"/ $host::"$@"/ "$@"
    do
        echo "TRY AGAIN"
        sleep 2
     done
}

export -f doitright

find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I{} bash -c "doitright {}"

相关内容