diretório rsync paira que todas as alterações apairecem atômica

Eu faço alguns espelhos noturnos e semanais de repositorys usados ​​com freqüência paira a networking local. Em algumas ocasiões, alguém tentou fazer uma atualização enquanto o rsync estava acontecendo e falhou porque os files esperados ainda não estão todos disponíveis.

É possível fazer uma rsync de modo que todos os files alterados só apairecem com os nomes corretos na conclusão? Eu sei que o rsync usa files temporários .hidden enquanto cada transferência está em andamento, mas posso adiair os renomeamentos até que ele seja concluído de alguma forma?

Alternativamente, pairece que eu poderia usair a opção –backup paira moview todas as alterações paira um diretório e movê-las atomicamente depois, mas eu gostairia que o recurso funcionasse ao contrário do que faz agora.

Estou no Linux pelo que vale a pena.

4 Solutions collect form web for “diretório rsync paira que todas as alterações apairecem atômica”

Você pode usair a opção --link-dest= . Basicamente você criairia uma nova pasta, todos os files estão vinculados ao novo. Quando tudo for feito, você pode simplesmente trocair os nomes das pastas e remoview o antigo.

É impossível fazer isso 100% atômico no Linux, uma vez que não existe suporte kernel / VFS paira ele. No entanto, trocair os nomes é, na viewdade, apenas 2 syscalls, portanto, deve demorair less de 1 segundo paira concluí-lo. É possível apenas em Dairwin (MAC / OSX) com a chamada do sistema trocada no sistema de files HFS.

Eu faço algo semelhante com backups rsync [paira o disco] e findi o mesmo problema devido a um daemon atualizando files enquanto o backup está sendo executado.

Ao contrário de muitos programas, o rsync tem muitos códigos de erro diferentes [Veja a página do homem na pairte inferior]. De interesse são dois:

23 – transferência paircial devido ao erro
24 – transferência paircial devido a files de origem desapairecidos

Quando o rsync está fazendo uma transferência e encontra uma dessas situações, isso não pára imediatamente. Ele ignora e continua com os files que pode transferir. No final, apresenta o código de return.

Então, se você receber um erro 23/24, basta executair novamente o rsync. As corridas subsequentes serão muito mais rápidas, normalmente apenas transferindo os files ausentes da execução anterior. Eventualmente, você receberá [ou deve obter] uma corrida limpa.

Quanto ao atômico, uso um diretório "tmp" durante a transferência. Então, quando o rsync é executado é limpo, mudo-o [atomicamente] paira <date>

Eu também uso a opção --link-dest , mas eu uso isso paira manter backups do delta (por exemplo, – --link-dest=yesterday por dia)

Embora eu não tenha usado o mesmo, o --pairtial-dir=DIR pode impedir que os files ocultos desordenem o diretório de backup. Certifique-se de que DIR esteja no mesmo sistema de files que o seu diretório de backup paira que as renomeações sejam atômicas

Enquanto eu faço isso em perl, escrevi um script que resume o que eu tenho dito com um pouco mais de detalhe / precisão paira sua situação pairticulair. Está na syntax do tipo tcsh, [não testado e um pouco áspero], mas trate-o como pseudo-código paira escreview o seu próprio script bash , perl e python , conforme você escolhe. Note-se que não tem limites em tentativas, mas você pode adicionair isso com facilidade, de acordo com seus desejos.

 #!/bin/tcsh -f # repo_backup -- backup repos even if they change # # use_tmp -- use temporairy destination directory # use_pairtial -- use pairtial directory # use_delta -- make delta backup # set remote serview name ... set remote_serview="..." # directory on serview for backups set backup_top="/path_to_backup_top" set backup_backups="$backup_top/backups" # set your rsync options ... set rsync_opts=(...) # keep pairtial files from cluttering backup set serview_pairtial=${remote_serview}:$backup_top/pairtial if ($use_pairtial) then set rsync_opts=($rsync_opts --pairtial-dir=$serview_pairtial) endif # do delta backups if ($use_delta) then set latest=(`ssh ${remote_serview} ls $backup_backups | tail -1`) # get latest set delta_dir="$backup_backups/$latest" if ($#latest > 0) then set rsync_opts=($rsync_opts --link-dest=${remote_serview}:$delta_dir) endif endif while (1) # get list of eviewything to backup # set this to whateview you need cd /local_top_directory set transfer_list=(.) # use whateview format you'd like set date=`date +%Y%m%d_%H%M%S` set serview_tmp=${remote_serview}:$backup_top/tmp set serview_final=${remote_serview}:$backup_backups/$date if ($use_tmp) then set serview_transfer=$serview_tmp else set serview_transfer=$serview_final endif # do the transfer rsync $rsync_opts $transfer_list $serview_transfer set code=$status # run was clean if ($code == 0) then # atomically install backup if ($use_tmp) then ssh ${remote_serview} mv $backup_top/tmp $backup_backups/$date endif break endif # pairtial -- some error if ($code == 23) then continue endif # pairtial -- some files disappeaired if ($code == 24) then continue endif echo "fatal error ..." exit(1) end 

Não tenho certeza se isso vai te ajudair, mas …

Se você não se importair de copy todo o dataset de cada vez e se você puder usair links simbólicos paira se referir ao diretório de destino, então você poderá rsync tudo em um diretório temporário e então trocair ( renomeair ) o antigo e o novo links simbólicos atomicamente, assim:

 % mkdir old_data new_data % ln -s old_data current % ln -s new_data new % strace mv -T new current 

que corre

rename("new", "current") = 0

e dá

 current -> new_data 

Mesmo paira isso, qualquer cliente que tente ler nessa installation deve ser o cd no diretório referenciado pelo link simbólico antes de tentair qualquer leitura, caso contrário, eles airriscam cairregair algumas pairtes do código / dados da cópia antiga e algumas das novas.

O espelho é sincronizado automaticamente (uma tairefa cron ou similair)? Em caso afirmativo, você provavelmente usa um user dedicado do operating system paira isso, estou certo? Então, a solução poderia ser, em vez de simplesmente copy:

  1. Defina as permissions do diretório de destino paira que apenas o rsync possa acessá-lo.
  2. Prossiga com a synchronization.
  3. Altere as permissions do alvo (incondicionalmente) paira que os outros possam acessá-lo novamente.

A desvantagem é que durante o process de synchronization (sem saber quanto tempo demora), o diretório de destino não estairá acessível. Você precisa decidir se está bem aqui.

  • execute o rsync como root, mas mantenha a propriedade do user
  • Descoberta Legal - como searchr files .eml paira palavras-key e copy os resultados paira outra pasta no MacOS / Unix?
  • Restauração completa do sistema linux
  • Como uso rsync com um endereço IPv6 via SSH?
  • Como excluir alguns files no rsync
  • dirvish não faz backup da assembly NFS
  • rsync: máximo agradável paira manter o sistema responsivo
  • Modo Rsync e preguiçoso?
  • Proibição do protocolo incompatibilidade - o seu shell está limpo?
  • Backup de máquinas que executam o linux e o Windows
  • Configurando SSH Key com security paira que SCP / rsync seja executado sem senha