Shell-Skript - XARGS: Die Arguments Zeile ist zu lang.

emulbetsup

Lieutenant
Registriert
Feb. 2008
Beiträge
512
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.

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!
 
find ... -exec rm -r {} +
 
  • Gefällt mir
Reaktionen: emulbetsup
Code:
find -type d -mmin +$timer -exec rm -r {} +
????
 
-exec rm braucht man heute nicht mehr.

Code:
# 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
Und so macht man das schon gar nicht mehr, zuviele Forks. Besser
Code:
find /Pfad -mtime +30 -delete
mtime im man mal bitte nachlesen, hier gibt es verschiedene Varianten.
 
  • Gefällt mir
Reaktionen: emulbetsup
emulbetsup schrieb:
Code:
find -type d -mmin +$timer -exec rm -r {} +
????

Damit läuft das Skript nicht mehr durch.

@PHuV
Code:
find -type d -mtime +$timer -delete

In dem Fall wäre die Zeile dann so, oder? Gilt -delete auch für Verzeichnisse?
 
Zuletzt bearbeitet:
Ja. Und mit -exec wäre inklusive Verzeichnisse das die richtige Form:
Code:
find -type d -mmin +$timer -exec rm -rf {} \;
 
  • Gefällt mir
Reaktionen: emulbetsup
Zurück
Oben