Como pular arquivos especiais / socket durante a transferência rsync?

5

Usando o seguinte comando.

rsync --archive --delete --partial --progress --recursive --no-links --no-devices --quiet source target

Usando --no-links e --no-devices já.

Obtendo as mensagens de erro como esta.

rsync: mknod "/mnt/shared/backup/var/spool/postfix/dev/log" failed: Operation not permitted (1)

Faz com que rsync saia de zero. Isto é mau. Quebra meu script de backup. (Eu não quero usar ignorar esse erro usando || true no caso de rsync falhará por motivos "legítimos", como nenhum espaço em disco restante.)

Neste exemplo, é um arquivo de soquete. Eu não me importo com esse tipo de arquivos especiais. Posso fazer o rsync ignorar / pular esses?

    
por adrelanos 06.06.2015 / 18:55

2 respostas

4

rsync -a --no-specials --no-devices diria ao rsync para ignorar esses arquivos. Ele ainda imprimirá uma mensagem informativa, mas retornará 0 se nenhum outro erro ocorrer.

Se houver um conjunto de caminhos conhecidos que você não deseja transferir, você poderá excluí-los completamente. Além disso, passe a opção -x para ignorar todos os sistemas de arquivos montados (incluindo /dev , que cuida do maior infrator), e se houver vários sistemas de arquivos em disco, liste todos os pontos de montagem (por exemplo, rsync -ax / /home /destination ) .

rsync -ax --exclude='/var/spool/postfix/dev/*' / /mnt/shared/backup

Se nada disso for satisfatório, faça uma lista dos arquivos que deseja pular . Tenha em atenção que, se alguns dos nomes de ficheiros estiverem sob o controlo de um adversário, poderão fazer com que alguns ficheiros sejam omitidos de uma cópia de segurança. Por exemplo, se eles criarem um diretório cujo nome é uma nova linha e criarem um soquete nomeado chamado * dentro dele, usar a saída de find -type s como uma lista de exclusões resultaria na exclusão de /* . Para evitar esses problemas, mantenha nomes problemáticos fora da lista de exclusão.

{
  cd /path/to/source &&
  find . -name '*[\[?*
]*' -prune -o \
               \( -type b -o -type c -o -type p -o -type s \) -print |
  sed 's/^\.//'
} | rsync -a --exclude-from=- /path/to/source /destination
    
por 06.06.2015 / 22:41
1

Talvez você possa usar rsync junto com find ? Algo parecido com isto:

find /your/source/dir -type s 1> /tmp/ignore-list
rsync <your options> --exclude-from=/tmp/ignore-list /your/source/dir/ /your/destination/dir/
    
por 06.06.2015 / 21:30