Estou usando du para monitorar continuamente a quantidade de dados gravados em unidades USB que estou duplicando.
Eu comparo o uso de disco das unidades de origem e de destino e exibo o progresso da cópia para o usuário.
O problema é que du informa 100% dos dados presentes na unidade de destino, embora muitos dados ainda estejam no cache do sistema, o LED da unidade esteja piscando e as unidades não estejam prontas para serem removidas.
Eu executo rsync , sync e umount em sequência para garantir que os dados estejam realmente lá antes de permitir que o usuário remova a unidade de destino. No entanto, não posso monitorar o progresso de sync . Assim, o usuário verá 100% muito antes de as unidades serem realmente sincronizadas.
Adoraria poder monitorizar o progresso da cópia "real", pois é o que realmente importa - não adianta ver rsync copiar completamente o ficheiro de 1 GB em 25 segundos, enquanto vou ter de esperar outro 5 minutos enquanto sync descarrega isso para dirigir (estou exagerando, mas você tem a idéia).
É assim que monitro rsync progress em um loop para cada unidade:
PROGRESS="$(echo "$(du -s "/MEDIA/TARGET" 2>/dev/null | cut -f 1) / $(du -s "/MEDIA/SOURCE" 2>/dev/null | cut -f 1) " | bc -l)"
$PROGRESS é uma flutuação entre 0 e 1, indicando a proporção entre o uso da unidade de origem e o uso da unidade de destino.
Como posso modificar isso para considerar somente os dados que já estão sincronizados para a unidade e não apenas aguardar no cache do sistema?
Editar:
Descobri que dd pode executar gravações omitindo o cache do sistema. Fiz um teste e, de fato, copiar um arquivo dessa maneira faz com que du reportem valores reais, e minhas indicações de progresso seriam finalmente precisas:
dd if=/media/SOURCE/file of=/media/TARGET/file bs=4M oflag=direct
Isso usa o cache de leitura, mas desabilitou o cache de gravação, facilitando o acompanhamento do rastreamento, sem executar leituras excessivas. O problema é que, para usar dd em vez de rsync , preciso recriar manualmente a estrutura de diretórios. Não preciso cuidar dos atributos de arquivo ou datas de modificação.
Eu acho que eu poderia usar uma combinação de find , mkdir e dd para primeiro recriar a árvore de diretórios e depois copiar os arquivos um por um. Eu me pergunto - se há alguma desvantagem para esta abordagem?