emulbetsup
Lieutenant
- Registriert
- Feb. 2008
- Beiträge
- 567
Guten Abend,
ich tüftel schon seit längerem an einem Backup-Skript, das als CronJob auf einem Fileserver ausgeführt automatisch ein Backup durchführen soll. Sollte der Speicherplatz auf dem Backupmedium nicht reichen, sollen sukzessive die alten Backups gelöscht werden, bis eben genug Speicherplatz für das jetzige Vollbackup vorhanden ist.
Anfangs lief das Skript auch so fehlerfrei durch. Zwischenzeitlich wirft aber XARGS einen Fehler, nachdem die Argumentenliste zu lang ist. Das wird daran liegen, dass zwischenzeitlich im zu sichernden Verzeichnis zu viele Unterverzeichnisse liegen.
Wie lässt sich das sinnvoll umgehen? Kann ich die Liste irgendwie sinnvoll limitieren? Google liefert zwar die möglichen Optionen, aber mehr fehlt das Wissen diese korrekt zu setzen. Sieht hier jemand eine praktikable Lösung?
Besten Dank für eure Unterstützung!
ich tüftel schon seit längerem an einem Backup-Skript, das als CronJob auf einem Fileserver ausgeführt automatisch ein Backup durchführen soll. Sollte der Speicherplatz auf dem Backupmedium nicht reichen, sollen sukzessive die alten Backups gelöscht werden, bis eben genug Speicherplatz für das jetzige Vollbackup vorhanden ist.
Code:
#!/bin/bash
clear
## Variablen
# Datenträger
# dst=488383484
# src=479668904
# maximale Vorhaltezeit und die Schrittweite in Minuten
timer=50400
incre=30
# Logfile
logfile="/home/serveradmin/skripte/logfile.txt"
# Mailversand
subject="!!!!! FileServer !!!!! Backup erfolgreich erstellt"
email="email@provider.tld"
emailmessage="/home/serveradmin/skripte/tempmail.txt"
## 1. Ermittlung des benötigten und des vorhandenen Speicherplatzes
# Ermittlung des freien Speicherplatzes
dskspcfr=`df -k /media/serveradmin/USBHDD/ | grep 488383484 | tr -s ' '| cut -d ' ' -f 4`
dskspcfrbfr=`df -k /media/serveradmin/USBHDD/ | grep 488383484 | tr -s ' '| cut -d ' ' -f 4`
# Ermittlung des benötigten Speicherplatzes
dskspcnd=`df -k /home/serveradmin/shares/ | grep 479668904 | tr -s ' '| cut -d ' ' -f 3`
echo
echo Freier Speicherplatz:
echo $dskspcfr KByte
echo
echo
echo Benötigter Speicherplatz:
echo $dskspcnd KByte
echo
## Start der Löschschleife
while [ $dskspcfr -lt $dskspcnd ]
do
# Wechsel ins Backup-Verzeichnis, da der Befehl find sonst alle Verzeichnisse auflistet
cd /media/serveradmin/USBHDD/backup
# finde alle Verzeichnisse, die älter sind als $timer | sortiere sie in umgekehrter Reihenfolge | Übergebe die Auswahl zeilenweise an den Löschbefehl
find -type d -mmin +$timer | sort -r | xargs -0 rm -r
echo $timer
# Ermittlung des freien Speicherplatzes
dskspcfr=`df -k /media/serveradmin/USBHDD/ | grep 488383484 | tr -s ' '| cut -d ' ' -f 4`
# Ermittlung des benötigten Speicherplatzes
dskspcnd=`df -k /home/serveradmin/shares/ | grep 479668904 | tr -s ' '| cut -d ' ' -f 3`
# Verringern des Timers
timer=$(($timer - $incre))
done
## Ende der Löschschleife
## Setzen des aktuellen Datums als Variable datestart
datestart=`date +%Y-%m-%d-%H-%M`
echo
echo Backup gestartet:
echo $datestart
echo
# Erstellt neues Backupverzeichnis
mkdir -p /media/serveradmin/USBHDD/backup/$datestart
# Kopiert den kompletten Inhalt des Shares in das erstelle Verzeichnis
cp -r /home/serveradmin/shares/ /media/serveradmin/USBHDD/backup/$datestart/
# Setzen des aktuellen Datums als Variable datenend
dateend=`date +%Y-%m-%d-%H-%M`
echo
echo Backup beendet:
echo $dateend
echo
echo
echo Freier Speicherplatz des Backup-Mediums vor der Ausführung des Skriptes:
echo $dskspcfrbfr KByte
echo
echo
echo Freier Speicherplatz des Backup-Mediums nach der Bereinigung:
echo $dskspcfr KByte
echo
dskspcfrend=`df -k /media/serveradmin/USBHDD/ | grep 488383484 | tr -s ' '| cut -d ' ' -f 4`
echo
echo Freier Speicherplatz nach dem Backup:
echo $dskspcfrend KByte
echo
# Befüllen der LogFile
echo "Backup gestartet:" >> $logfile
echo "$datestart" >> $logfile
echo "Backup beendet:" >> $logfile
echo "$dateend" >> $logfile
echo "Freier Speicherplatz des Backup-Mediums vor der Ausfuehrung des Skriptes:" >> $logfile
echo "$dskspcfrbfr KByte" >> $logfile
echo "Freier Speicherplatz des Backup-Mediums nach der Bereinigung:" >> $logfile
echo "$dskspcfr KByte" >> $logfile
echo "Freier Speicherplatz nach dem Backup:" >> $logfile
echo "$dskspcfrend KByte" >> $logfile
echo " " >> $logfile
# Befüllen der Email
echo "Ein Backup des Verzeichnisses /home/serveradmin/shares/ wurde erfolgreich erstellt" >> $emailmessage
echo " " >> $emailmessage
echo " " >> $emailmessage
echo "Backup gestartet:" >> $emailmessage
echo "$datestart" >> $emailmessage
echo " " >> $emailmessage
echo "Backup beendet:" >> $emailmessage
echo "$dateend" >> $emailmessage
echo " " >> $emailmessage
echo " " >> $emailmessage
echo "Freier Speicherplatz des Backup-Mediums vor der Ausfuehrung des Skriptes:" >> $emailmessage
echo "$dskspcfrbfr KByte" >> $emailmessage
echo " " >> $emailmessage
echo "Freier Speicherplatz des Backup-Mediums nach der Bereinigung:" >> $emailmessage
echo "$dskspcfr KByte" >> $emailmessage
echo " " >> $emailmessage
echo "Freier Speicherplatz nach dem Backup:" >> $emailmessage
echo "$dskspcfrend KByte" >> $emailmessage
echo " " >> $emailmessage
echo " " >> $emailmessage
echo "Beste Gruesse, der Fileserver" >> $emailmessage
# emailmessage verschicken
mail -s "$subject" "$email" < $emailmessage
# temporäre emailmessege.txt löschen
rm $emailmessage
echo
echo "Good Bye!"
echo
Anfangs lief das Skript auch so fehlerfrei durch. Zwischenzeitlich wirft aber XARGS einen Fehler, nachdem die Argumentenliste zu lang ist. Das wird daran liegen, dass zwischenzeitlich im zu sichernden Verzeichnis zu viele Unterverzeichnisse liegen.
Wie lässt sich das sinnvoll umgehen? Kann ich die Liste irgendwie sinnvoll limitieren? Google liefert zwar die möglichen Optionen, aber mehr fehlt das Wissen diese korrekt zu setzen. Sieht hier jemand eine praktikable Lösung?
Besten Dank für eure Unterstützung!