Kann der Befehl rm in einem Bash-Skript ausgeführt werden, bevor alle Dateien entfernt wurden?

7

Ich habe ein einfaches Bash-Skript geschrieben, um bestimmte Dateien täglich auf einem Backup-Mount zu sichern und die letzten 3 Tage der Backups aufzubewahren. Es ist offensichtlich zu einfach, da ich gelegentlich merkwürdiges Verhalten bekomme, das dadurch erklärt werden könnte, dass der erste MV ausgeführt wird, bevor der RM abgeschlossen ist.

Hier ist das Skript:

#!/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

Obwohl dies die meiste Zeit in Ordnung ist, habe ich manchmal Folgendes: Es sieht so aus, als würde dailyBackup-1 verschoben, bevor dailyBackup-2 vollständig gelöscht wurde. Wenn dies der Fall ist, wie kann dies am besten verhindert werden?

/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
Blitz
quelle

Antworten:

11

Das Problem ist höchstwahrscheinlich, dass rm fehlschlägt . Beachten Sie, dass var in dailyBackup-2 immer noch vorhanden ist, höchstwahrscheinlich, weil einige Dateien dort nicht gelöscht werden konnten.

als allgemeine Anmerkung zum Schreiben von Systemverwaltungs-Shellskripten:

a) Stellen Sie immer sicher, dass Sie die (Fehler-) Ausgabe Ihrer Skripte überprüfen. Sie erhalten sie automatisch per E-Mail von cronjobs, es sei denn, Ihr E-Mail-Setup ist fehlerhaft

b) Stellen Sie immer sicher, dass Sie alle Fehler behandeln, die auftreten können (z. B. rm oder mv schlägt fehl). Es ist eine gute Idee, set -e über Ihr Skript zu setzen, damit die Shell beendet wird, wenn sie die erste unbehandelte trifft Fehler (zum Debuggen fügen Sie auch set -x hinzu, das alle ausgeführten Befehle druckt, damit Sie sehen können, was das Skript tut)

und um auch Ihre ursprüngliche Frage zu beantworten: rm wird niemals beendet, bevor alle Dateien gelöscht wurden, oder genauer gesagt, bevor der Systemaufruf unlink () für die zuletzt gefundene Datei abgeschlossen ist. (Der einzige Fall, in dem ich mir vorstellen könnte, wo Dateien nach dem Aufheben der Verknüpfung noch vorhanden sind, ist möglicherweise ein obskures fehlerhaftes Netzwerk-Dateisystem ...) Aber das Beenden von rm bedeutet nicht, dass alle Dateien erfolgreich gelöscht wurden (selbst wenn Sie root sind und -fr verwenden () Sie verwenden nicht einmal -f)), z. B. wenn Dateien auf ext * -Dateisystemen als unveränderlich markiert sind oder wenn Dateien neu erstellt wurden, während rm den Baum durchlief. rm wird dies mit einer Fehlermeldung und erfolglosen Rückgabestatistiken melden.

r00t
quelle
Danke für die Erklärung und Tipps. Ich werde in die Fehlerausgabe schauen.
Flash
+1 für das Flag -e in Produktionsskripten. Guter Anruf.
pboin
Nur zum Aktualisieren: exzellenter Rat - Ich habe wirklich keine Fehler daraus gemacht und jetzt kann ich sehen, dass ja, rm manchmal ausfällt, also weiß ich jetzt, was ich untersuchen muss.
Flash
5

Versuchen Sie dies zu ändern

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

wie

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

Daher wird jeder Befehl nur ausgeführt, wenn der vorherige erfolgreich abgeschlossen wurde (oder mit anderen Worten mit dem Status 0 beendet wurde).

Janne Pikkarainen
quelle
1

Werden die Dateien auf einem anderen Server über nfs mount abgerufen? Wenn NFS mit weichen Halterungen eingerichtet ist, kann nicht garantiert werden, dass die Vorgänge abgeschlossen sind.

Trever Miller
quelle