Ein Skript mit dem Namen /root/backup.sh
w01, das den Inhalt von / home sichert
Das Skript wird:
- Erstellen Sie ein tar-Archiv mit dem Namen
/share/<YYYY><MM><DD>_w01.tar
where- JJJJ repräsentiert das aktuelle Jahr (dh 2014)
- MM repräsentiert den aktuellen Monat (dh 11)
- DD steht für den aktuellen Tag des Monats (dh 22)
- Log Erfolg und Fehler an
/tmp/backup.log
- Beenden Sie mit einem Rückkehrcode ungleich Null, wenn ein Fehler auftritt
Antworten:
Die wichtigsten Faktoren, die Sie zum Zusammenstellen des Skripts benötigen, sind die folgenden: (Ich empfehle Ihnen, jedes Skript als separates Stück Code zu schreiben, zu testen und alles zusammenzustellen, sobald Sie zufrieden sind.)
Dateinamen (dh unter Verwendung des aktuellen Datums in Ihrem Tarballnamen):
Wie in einer anderen Antwort angegeben,
man date
gibt Ihnen diese Hilfe, konzentrieren Sie sich auf den Formatabschnitt (z. B.date +%Y%m
...).Protokollierung (dh Speichern der Ausgabe des TAR in einer Datei, auf die Sie später verweisen können):
Zunächst müssen Sie entscheiden, wie lange das Protokoll gespeichert werden soll, ob Sie die Versuche des Vortages dort ausführen möchten oder nur die neuesten ? Wenn Sie mehrere Tage sparen, möchten Sie am Anfang jedes neuen Laufs einen Datenstempel einfügen, damit Sie sehen können, wo einer endet und der nächste beginnt.
echo "here's a command" > /tmp/backup.log
überschreibt den Inhalt von /tmp/backup.log und setzt den String "here's a command" an seine Stelle.echo "here's a command" >> /tmp/backup.log
behält alle vorhandenen Daten in /tmp/backup.log bei und hängt "hier ist ein Befehl" an das Ende an.tar -cvf /share/foo.tar /home > /tmp/backup.log
Es wird nur STDOUT (dh die übliche Ausgabe von "Ich habe diese Dateien als Ziel ausgewählt") in das Protokoll aufgenommen, Fehler werden jedoch nicht erfasst.tar -cvf /share/foo.tar /home 2> /tmp/backup.log
wird nur STDERR (dh nur die Fehler) in das Protokoll setzen.tar -cvf /share/foo.tar /home > /tmp/backup.log 2>&1
Fügt sowohl STDOUT als auch STDERR in das Protokoll ein.Kombinieren Sie diese, um genau den richtigen Datensatz in Ihrem Protokoll zu erstellen.
Fehlerbehandlung (dh was ist, wenn Teer zu tun , einen Fehler zurückgibt:
Eine schnelle und schmutzige Art und Weise , um Fehler in einem Befehl zu reagieren , wird nur hinzufügen
|| command_to_run_if_error
. Nach dem Befehl Dies sagt im Wesentlichen „ um diesen Befehl ausführen , bis es gelingt“, können Sie auch Verwenden Sie&& command_to_run_if_success
dies als würde man sagen "Führe diese Befehle der Reihe nach aus, bis einer ausfällt".command1 || command2
Führt Befehl1 aus und wenn dies fehlschlägt (Exit-Code ungleich Null), wird Befehl2 ausgeführt. Wenn dies erfolgreich ist, wird command2 nicht ausgeführt.command1 && command2
Führt command1 aus und wenn dies fehlschlägt, wird command2 angehalten und nicht ausgeführt. Wenn command1 erfolgreich ist, wird nur command2 ausgeführt.if .. then .. else .. fi
z.B
echo "About to run command1" >> logfile.log
if command1 >> logfile.log
then
echo "All went well" >> logfile.log
else
echo "Something went wrong! ABORTING" >> logfile.log
run_some_cleanup_command
exit 1
fi
Kombinieren Sie diese, um Ihrem Skript beizubringen, was für jeden Fehlerfall zu tun ist.
Einige andere Dinge zu beachten:
Möchten Sie überprüfen, ob Platz für Ihren Tarball vorhanden ist, bevor Sie ihn erstellen?
Überlegen Sie
du -sk /home
, wie viele KB gesichert werden müssen, und vergleichen Sie dies mit der Menge an freiem Speicherplatz indf -k /share
. Sie können Shell-Befehle verwenden,[ $space_on_share -lt $data_in_home ] || exit 1
um den Vorgang abzubrechen, anstatt den gesamten freien Speicherplatz zu belegen.Möchten Sie alles in / zu Hause sichern?
Erwägen Sie, eine Liste von Dingen zu haben, die ausgeschlossen werden sollten, um Platz zu sparen oder die Privatsphäre zu schützen.
Haben Sie darüber nachgedacht, Komprimierung zu verwenden, um Platz zu sparen?
Einige Versionen von tar akzeptieren das
-z
Flag, um die gzip-Komprimierung zu verwenden, oder Sie können STDOUT als Dateinamen angeben und dann die Ausgabe durch gzip (tar -cf - /home | gzip -c > /share/foo.tar.gz
) leiten.quelle
Der Schlüssel zum Starten eines Skriptproblems besteht darin, es in kleine Teile zu zerlegen. Codieren und testen Sie die ersten kleinen Teile, bevor Sie weitere Funktionen hinzufügen.
Zum Beispiel
Schritt 1
Sie könnten damit beginnen, ein Skript zu schreiben, das "Starting backup" ausgibt und sonst nichts tut.
Schritt 2
Wenn dies funktioniert, ändern Sie es, um die Ausgabe des
date
Befehls einer Shell-Variablen zuzuweisen (z. B.$today
) und den Inhalt dieser Variablen zu drucken.Schritt 3
Wenn Schritt 2 vollständig getestet wurde und funktioniert,
man date
sehen Sie sich an, wie Sie die Ausgabe ändern, um das gewünschte Ausgabeformat "<JJJJ> <MM> <TT>" zu erhalten.und so weiter. Wenn Sie zu irgendeinem Zeitpunkt nicht weiterkommen, durchsuchen Sie SuperUser (usw.) nach dieser speziellen kleinen, gut fokussierten Frage, um festzustellen, ob eine Antwort vorhanden ist. Wenn nicht, schreiben Sie eine sorgfältig komponierte, eng fokussierte Frage, die zeigt, was Sie getan haben, was es getan hat und was Sie stattdessen von ihm wollten. Zeigen Sie den ausführbaren Code an, aber entfernen Sie alles Fremdmaterial.
quelle