Repetindo o comando com falha que é executado com xargs

2

Eu tenho um script em que os arquivos do rsync são executados em paralelo usando o modo de daemon xargs e rsync. Eu ocasionalmente recebo erros com rsync devido a gravações acontecendo na fonte. Eu quero ser capaz de repetir o rsync se houver algum erro. Eu pensei que isso funcionaria, mas ter um ponto e vírgula parece quebrá-lo. Há outra maneira de fazer isso?

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'

    
por minhaz1 15.12.2015 / 00:25

2 respostas

0

Apenas corte & colando algumas coisas por aí, colocando até o começo ...

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

Isso executa o find ... | xargs ... até que ele retorne verdadeiro.

Para executar o rsync em um único diretório que falha, é necessário um rsync para apenas um diretório, sem xargs, e tente dividir o find e o test / loop (pode falhar se houver novas linhas ou caracteres malucos nos nomes de 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

Este próximo provavelmente é a resposta pela qual você está esperando, os xargs chamam uma função várias vezes e a função faz a parte "repetir se falhou":

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 {}"
    
por 15.12.2015 / 08:09
0

Com o GNU Parallel você faria:

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