2

У меня есть скрипт, который параллельно пересылает файлы rsync, используя режимы демонов xargs и 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'

2 ответа2

0

Просто вырезать и вставлять что-то вокруг, ставить до начала ...

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

Это запускает поиск ... | xargs ... пока не вернет true.


Чтобы просто запустить rsync в единственном каталоге, который не работает, нужен rsync только для одного dir, без xargs, и попробуйте разделить find и test/loop (может произойти сбой, если в именах dir есть символы новой строки или ненормальные символы):

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 {}"
0

С GNU Parallel вы бы сделали:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .