
Ich schreibe ein Backup-Skript für meinen E-Mail- und Cloud-Dienst.
Der Einfachheit halber habe ich hier nur den Mail-Backup-Teil gepostet.
Im Grunde habe ich eine Host-Maschine, auf der einige virtuelle Boxen laufen.
Diese virtuellen Boxen greifen auf Host-Maschinen zu, /mnt/alias/storage/
auf denen sich der vmail-Ordner befindet (in meinem Fall shishaMail genannt).
(Die folgenden Informationen sind möglicherweise nicht erforderlich)
Ich möchte sagen, dass alles darin ein Formular mit hübschen Namen /mnt/alias/
ist . In diesem Rack-Ordner befinden sich die Halterungen der Laufwerke.ln -s
/mnt/rack/*
(Nicht notwendige Informationen, ENDE)
Hier ist mein Skript
#!/bin/bash
# backup script
BASEURL="/mnt/alias/backup"
MAILURL="/mnt/alias/storage/shishaMail"
DAY=`eval date +"%d"`
MONTH=`eval date +"%m"`
YEAR=`eval date +"%Y"`
HOUR=`eval date +"%H"`
MINUTE=`eval date +"%M"`
PIMPURL=$BASEURL/$YEAR/$MONTH/$DAY/
COMMAND1="cd $PIMPURL"
$COMMAND1 2>/dev/null
if [ $? -eq 0 ]
then
echo "Command 1 was successful"
else
echo "There ain't folders!!"
echo "I'll mkdir some!"
COMMAND2="mkdir -p $PIMPURL"
$COMMAND2 2>/dev/null
fi
if [ $? -eq 0 ]
then
echo 'Command 1 or/and 2 was successful'
echo "STARTING MAIL BACKUP"
COMMAND3="tar -cvzf '"$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz' "$MAILURL
echo $COMMAND3
$COMMAND3 2>/dev/null
if [ $? -eq 0 ]
then
echo 'MAIL BACKUP SUCCESSFULL'
else
echo "FAILURE!!"
fi
else
echo 'Nope! Must be some kind of strage Err0r!!'
fi
Wenn ich dieses Skript ausführe, erhalte ich die folgende Fehlermeldung:
Befehl 1 war erfolgreich.
Befehl 1 und/oder 2 war erfolgreich.
E-Mail-Sicherungskopie wird gestartet.
tar -czvf „/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz“ /mnt/alias/storage/shishaMail
tar: Entfernen des führenden „/“ aus den Mitgliedsnamen
tar (untergeordnet): „/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz“: Kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
tar (untergeordnet): Fehler nicht behebbar: Beenden jetzt
. FEHLER!!
Wie Sie sehen, gibt es einen Befehl echo
vom Typ COMMAND3, der wie folgt lauten würde:
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_21_.data.tar.gz' /mnt/alias/storage/shishaMail
Und wenn ich diesen Befehl manuell ausführe, als derselbe Benutzer, als der ich das Skript ausführe (was in beiden Fällen root wäre), funktioniert es.
Ich verstehe nicht, warum das Skript sich über eine nicht vorhandene Datei oder ein nicht vorhandenes Verzeichnis beschwert, da die Verzeichnisse außer der Datei existieren, *.tar.gz
da diese von erstellt werden muss tar
.
Antwort1
Versuchen Sie, die einfachen Anführungszeichen aus der COMMAND3-Erstellungszeile zu entfernen:
COMMAND3="tar -cvzf "$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz "$MAILURL
Wenn Sie diese Zeile manuell ausführen, entfernt die Shell die Anführungszeichen, bevor Tar die Argumente jemals sieht.
Sie fügen keine Leerzeichen in den Dateinamen ein, daher sind Anführungszeichen nicht erforderlich. Tatsächlich könnten Sie diese Zeile noch etwas vereinfachen:
COMMAND3="tar -cvzf ${PIMPURL}shisha_${HOUR}_${MINUTE}_.data.tar.gz ${MAILURL}"
Die geschweiften Klammern dienen zur Abgrenzung der Variablennamen, andernfalls würde versucht, „PIMPURLshisha“ zu erweitern, was wahrscheinlich nicht das ist, was Sie wollen. Es schadet nie, sie zu verwenden, da Variablen dadurch auch hervorgehoben werden und leichter zu erkennen sind.