Obtenha o rsync para relatar se algum arquivo local foi atualizado

3

Estou executando o rsync para fazer pull de um host remoto para o host local.

rsync -a --update user@remotehost:/files/ ~/files/

Estou executando esse comando de java e usando o código de saída para descobrir se ele foi bem-sucedido ou não.

É possível obter esse comando para informar se algum arquivo local foi modificado? Reportar de volta por meio de um código de saída seria ideal.

    
por Fidel 06.11.2015 / 19:38

3 respostas

4

Você não pode obter rsync para informar isso por meio do código de saída. Os códigos de saída documentaram significados pré-definidos.

Acho que a melhor maneira de fazer isso a partir do java seria adicionar a opção --info=NAME para mencionar somente nomes de diretórios e arquivos atualizados:

rsync -a --info=NAME --update user@remotehost/files/ ~/files/

Imprime os nomes dos arquivos e diretórios atualizados, um por linha, na saída padrão (fd = 0).

Em seguida, você coletaria a saída de rsync e contaria o número de novas linhas na string.

Eu acho que uma boa maneira de coletar a saída em java pode ser encontrada nesta resposta, mas eu não tentei: link

Fazer não usar redirectErrorStream ou, de qualquer outra forma, mesclar a saída padrão de um fluxo de erro padrão. Se fizer isso, você contará as mensagens de erro como arquivos atualizados, não o que você deseja.

    
por 06.11.2015 / 21:00
0

A maneira de obter as informações por código de retorno seria escrever um script de shell que chame rsync e executar o script de shell a partir de java. Existem alguns problemas importantes com isso, como esqueço abaixo. O script de shell pode ser assim:

#!/bin/sh
if OUTPUT=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
then
    if [ "$OUTPUT" != "" ]                   # got output?
    then
        exit 0  # yes, success, "some" files were updated
    fi
fi
exit 1  # either rsync failed or no files were updated

O principal problema com isto é que você não será capaz de dizer se o processo de sincronização foi completado com sucesso. Você só sabe se os arquivos foram atualizados ou não. É por isso que recomendo coletar a saída em java e contar as linhas e verificar o código de retorno em java .

    
por 07.11.2015 / 01:55
0

O sinalizador -v em rsync exibirá o caminho de qualquer arquivo transferido. O código de saída de rsync indica sucesso / falha para que você não possa usá-lo sem envolver um script ao redor do comando, como

#!/bin/bash

num_files=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)

if [[ $num_files > 1 ]]; then
  # files were transferred
  exit 1
else
  # files weren't transferred
  exit 0
fi

e, em seguida, chamando esse script de java em vez do comando rsync diretamente. rsync provavelmente produzirá algumas outras linhas de texto no início e no final da transmissão, portanto, talvez seja necessário ajustar a instrução if para considerar as linhas extras de saída, mas a ideia básica funcionaria.

    
por 06.11.2015 / 20:01