O comando rm pode ser concluído em um script antes de todos os arquivos serem removidos?

7

Eu escrevi um script bash simples para fazer backup de determinados arquivos diariamente para uma montagem de backup e manter os últimos 3 dias de backups. É óbvio que é muito simples, já que ocasionalmente estou tendo um comportamento estranho que pode ser explicado pelo primeiro mv sendo executado antes que a empresa esteja completa.

Aqui está o script:

#!/bin/bash

mount /mnt/backups

while [ ! -d /mnt/backups/dailyBackup-0 ]
do
        echo "Backup mount not present, sleeping..."
        sleep 30
done

rm -r /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-1 /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-0 /mnt/backups/dailyBackup-1

dirname="/mnt/backups/dailyBackup-0"
mkdir $dirname

cd /
rsync -qr --stats root etc var $dirname

umount /mnt/backups
Embora isso seja bom na maior parte do tempo, às vezes acabo com o seguinte, que parece que o dailyBackup-1 está sendo movido antes que o dailyBackup-2 tenha sido excluído. Se é isso que está acontecendo, qual é a melhor maneira de preveni-lo?

/mnt/backups/dailyBackup-0:
total 0
drwxrwxrwx 1 root root 0 2010-12-07 03:27 var
drwxrwxrwx 1 root root 0 2010-12-07 02:39 root
drwxrwxrwx 1 root root 0 2010-12-07 02:38 etc

/mnt/backups/dailyBackup-1:
total 0
drwxrwxrwx 1 root root 0 2010-12-06 03:26 var
drwxrwxrwx 1 root root 0 2010-12-06 02:32 root
drwxrwxrwx 1 root root 0 2010-12-06 02:32 etc

/mnt/backups/dailyBackup-2:
total 0
drwxrwxrwx 1 root root 0 2010-12-07 02:36 var
drwxrwxrwx 1 root root 0 2010-12-05 03:21 dailyBackup-1
    
por flash 16.12.2010 / 12:37

3 respostas

11

o problema é mais provável que o rm falha , note que var ainda está lá no dailyBackup-2, provavelmente porque alguns arquivos não puderam ser excluídos.

como uma nota geral sobre como escrever scripts de gerenciamento do sistema:

a) certifique-se sempre de verificar a saída (erro) dos seus scripts,    você receberá automaticamente via e-mail de cronjobs, a menos que seu    a configuração do email está quebrada

b) sempre certifique-se de lidar com todos e quaisquer erros que possam ocorrer    (por exemplo, rm ou mv falhando)    é uma boa ideia colocar set -e no topo do seu script,    Isso fará com que o shell saia quando atingir o primeiro erro não manipulado    (para depuração, adicione também set -x, que imprimirá todos os comandos sendo executados,     para que você possa ver o que o script está fazendo)

e também para responder à sua pergunta original: rm nunca sairá antes de deletar todos os arquivos, ou mais corretamente, antes do unlink () chamada do sistema para o último arquivo que encontrou concluído. (o único caso que eu poderia imaginar onde arquivos ainda podem estar lá depois de ser desvinculado  pode ser algum sistema de arquivos de rede com bugs obscuros ...) mas rm exiting não significa que todos os arquivos foram apagados com sucesso (mesmo se você for root e estiver usando -fr (você não está nem mesmo usando -f)), por exemplo, se os arquivos estiverem marcados como imutáveis em ext * filesystems, ou se os arquivos foram criados recentemente enquanto o rm estava percorrendo a árvore. rm reportará isso com uma mensagem de erro e status de retorno malsucedido tho '

    
por 16.12.2010 / 13:11
5

Tente alterar isso

rm -r /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-1 /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-0 /mnt/backups/dailyBackup-1

como

rm -r /mnt/backups/dailyBackup-2 &&
mv /mnt/backups/dailyBackup-1 /mnt/backups/dailyBackup-2 &&
mv /mnt/backups/dailyBackup-0 /mnt/backups/dailyBackup-1 &&

para que cada comando seja executado somente se o anterior foi concluído com sucesso (ou, em outras palavras, saiu com status 0).

    
por 16.12.2010 / 12:58
1

Os arquivos estão em outro servidor, acessados via nfs mount? Se o NFS estiver configurado com montagens suaves, ele não garante que as operações serão concluídas.

    
por 16.12.2010 / 16:36