
Estou executando o rsync para puxar de um host remoto para o host local.
rsync -a --update user@remotehost:/files/ ~/files/
Estou executando esse comando em java e usando o código de saída para descobrir se foi bem-sucedido ou não.
É possível fazer com que esse comando relate se algum arquivo local foi modificado? Reportar por meio de um código de saída seria o ideal.
Responder1
Você não pode rsync
dizer isso por meio do código de saída. Os códigos de saída documentaram significados predefinidos.
Acho que a melhor maneira de fazer isso em Java seria adicionar a opção --info=NAME
de mencionar apenas diretórios e nomes de arquivos atualizados:
rsync -a --info=NAME --update user@remotehost/files/ ~/files/
Isso 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 rsync
e contaria o número de novas linhas na string.
Acho que uma boa maneira de coletar a saída java
pode ser encontrada nesta resposta, mas ainda não tentei:https://stackoverflow.com/a/9048519/5484716
Fazernãousar redirectErrorStream
ou de qualquer outra forma mesclar a saída padrão e os fluxos de erro padrão. Se fizer isso, você contará as mensagens de erro como arquivos atualizados, e não como deseja.
Responder2
Com base na ideia de @DavidKing de permitir que o rsync imprima nomes de arquivos copiados e expandido com informações de @yashma de que grep sairá do status de saída diferente de zero quando stdin estiver vazio, podemos criar esta linha satisfatoriamente curta e enigmática:
# prints file list, exits nonzero when that list is empty
rsync -a --info=NAME --update user@remotehost:/files/ ~/files/ | grep .
Responder3
O --info
sinalizador ativado 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 em torno do comando como
#!/bin/bash
files=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
if [ $files = "" ]; then
# files weren't transferred
exit 0
else
# files were transferred
exit 1
fi
e então chamar esse script de java em vez do rsync
comando diretamente. rsync
provavelmente produzirá algumas outras linhas de texto no início e no final da transmissão, então você pode precisar ajustar a if
instrução para dar conta das linhas extras de saída, mas a ideia básica funcionaria.
Responder4
A maneira de obter as informações por código de retorno seria escrever um script de shell que chama rsync
e executa o script de shell de java. Existem alguns problemas importantes com isso, conforme descrevo abaixo. O script de shell poderia 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 isso é que você não será capaz de saber se o processo de sincronização foi concluído 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 linhaseverifique o código de retornoem java.