![重试使用 xargs 运行的失败命令](https://linux22.com/image/1476994/%E9%87%8D%E8%AF%95%E4%BD%BF%E7%94%A8%20xargs%20%E8%BF%90%E8%A1%8C%E7%9A%84%E5%A4%B1%E8%B4%A5%E5%91%BD%E4%BB%A4.png)
我有一个脚本,使用 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 {}"