plategt
Anmeldungsdatum: 22. November 2012
Beiträge: 36
|
Hallo zusammen, ich habe ein Backupscript laufen, welches von einem Remote-Server Dateien auf den lokalen Server kopiert und wöchentlich per Crontab ausgeführt wird. Das Script hat folgendes Format: | ssh -i /serververbindung 'tar czvf - QuellordnerRemote' | cat > /lokal/zieldatei_$(date "+%a").tar.gz
|
Das führt zu einer Zieldatei mit dem Namen zieldatei_Fri.tar.gz (bei Ausführung Freitags).
Jede Woche wird die vorige Datei überschrieben. Generell ist das auch gut und gewünscht, da es recht einfach ist. Nun würde ich allerdings gerne zwei Dateiversionen (also zwei Wochen) behalten. Die einfachste Möglichkeit wäre ein Dateiname zieldatei_Fri_1.tar.gz und zieldatei_Fri_2.tar.gz und alle zwei Wochen wird die jeweilige Datei überschrieben. Jedoch kann ich dazu weder mit Datum, noch Wochen noch Tagen arbeiten, da die ja nicht alle zwei Wochen gleich wären. Eine einfache Zahl (1 und 2) würde dafür sorgen, dass alle zwei Wochen automatisch überschrieben.
Mit fällt im Moment auch nicht ein wie ich eine Schleife oder Variable nutzen könnte, da sich das Script bei erneuter Ausführung ja nicht den vorigen Stand merkt. Vielleicht hat jemand eine Idee? Danke im Voraus. Gruß plate Bearbeitet von rklm: Syntaxhighlighting
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4391
Wohnort: Göttingen
|
Du könntest ja einfach schauen, welche der beiden Dateien die ältere ist und die dann wählen...
|
plategt
(Themenstarter)
Anmeldungsdatum: 22. November 2012
Beiträge: 36
|
Danke für deine Antwort. Mir ist im Moment auch noch eingefallen die Kalenderwochen einfach auf gerade und ungerade (z.B. per Modulo-Division) zu prüfen und dann ne Variable auf 1 oder 2 setzen. Stand vorher wohl etwas auf dem Schlauch. Funktioniert zwar noch nicht so ganz, aber ist bestimmt hinzubekommen. Gruß plate
|
hellmi666
Anmeldungsdatum: 30. August 2007
Beiträge: 238
Wohnort: Zwickau
|
Oder das Datum in den Ordnernamen einbringen und alles, was älter als zwei Wochen ist, löschen.
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 58
|
Du kannst auch immer vor dem Backup von der .1 auf die .2 verschieben und dann die .1 überschreiben.
|
plategt
(Themenstarter)
Anmeldungsdatum: 22. November 2012
Beiträge: 36
|
Sind einige Ideen dabei.
Ich dachte am Anfang daran, keine Löschfunktion zu benutzen, da dies dann mehr (unnötiger) Code ist. Daher fand ich überschreiben ganz attraktiv.
Aber ich werde demnächst einen der Ansätze umsetzen. Im Zuge dessen wäre allerdings noch interessant:
Die eigentliche Idee war, dass der Ordner auf dem Quellserver gepackt wird und dann das Archiv übertragen wird. Ich bin mir allerdings nicht ganz sicher ob er nicht alle einzelnen Dateien zuerst übertragt und das Archiv dann auf dem Zielserver packt. Das wäre aus Übertragungssicht ja suboptimal. Danke und Gruß, plate
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
plategt schrieb:
| ssh -i /serververbindung 'tar czvf - QuellordnerRemote' | cat > /lokal/zieldatei_$(date "+%a").tar.gz
|
Mal wieder ein Useless Use of cat Award! Das reicht völlig: | ssh -i /serververbindung 'tar czvf - QuellordnerRemote' > /lokal/zieldatei_$(date "+%a").tar.gz
|
Ich würde auch das Verfahren mit .1 und .2 und Verschieben nutzen. Das hat den Vorteil, dass man immer die neueste Datei unter .1 hat, womit die Reihenfolge des Alters immer gleich bleibt. plategt schrieb:
Die eigentliche Idee war, dass der Ordner auf dem Quellserver gepackt wird und dann das Archiv übertragen wird. Ich bin mir allerdings nicht ganz sicher ob er nicht alle einzelnen Dateien zuerst übertragt und das Archiv dann auf dem Zielserver packt. Das wäre aus Übertragungssicht ja suboptimal.
Wie kommst Du darauf? Du lässt tar und gzip auf dem anderen Rechner laufen und sendest nur das komprimierte Archiv über das Netz, dass Du dann in eine Datei umleitest.
|
plategt
(Themenstarter)
Anmeldungsdatum: 22. November 2012
Beiträge: 36
|
Danke für deine Antwort.
Mal wieder ein Useless Use of cat Award! Das reicht völlig:
Danke. Wo kann ich den abholen? 😉 . Werde es korrigieren.
Wie kommst Du darauf? Du lässt tar und gzip auf dem anderen Rechner laufen und sendest nur das komprimierte Archiv über das Netz, dass Du dann in eine Datei umleitest.
Aber wäre es nicht gut die .tar.gz Datei auf dem Quellrechner zu erstellen und nur diese dann zu übertragen? Vielleicht versteh ich auch etwas falsch. Gruß, plate
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
plategt schrieb:
Danke. Wo kann ich den abholen? 😉 . Werde es korrigieren.
☺ Ich glaube, die offizielle Seite ist diese: http://porkmail.org/era/unix/award.html
Aber wäre es nicht gut die .tar.gz Datei auf dem Quellrechner zu erstellen und nur diese dann zu übertragen? Vielleicht versteh ich auch etwas falsch.
Das ist genau das was passiert. Nur, dass sie halt nicht auf der Platte materialisiert sondern sogleich übers Netz geschickt wird, was den überflüssigen IO auf der lokalen Platte des Servers vermeidet. Vielleicht musst Du noch mal nachlesen, was das ssh -Kommando da macht und was die Bedeutung von "z" und "-" in der Argumentliste von tar ist. Die Option "v" würde ich übrigens weglassen, die erzeugt nur unnötigen Netzwerkverkehr für die Dateiliste auf Stderr.
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 58
|
Da ist ein kleiner, aber fataler Fehler drin:
{{{
ssh -i /serververbindung 'tar czvf - QuellordnerRemote' > /lokal/zieldatei_$(date "+%a").tar.gz
}}}
Das > muss maskiert werden z. B. als '>' oder \>, sonst wird es lokal interpretiert und die Ausgabedatei wird lokal erzeugt und nicht remote.
Also so ...
{{{
ssh -i /serververbindung 'tar czvf - QuellordnerRemote' '>' /lokal/zieldatei_$(date "+%a").tar.gz
}}}
... oder so ...
{{{
ssh -i /serververbindung 'tar czvf - QuellordnerRemote > /lokal/zieldatei_$(date "+%a").tar.gz'
}}}
Das scheint wohl so beabsichtigt zu sein. Mein Fehler.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
fork991 schrieb: Da ist ein kleiner aber fataler Fehler drin:
ssh -i /serververbindung 'tar czvf - QuellordnerRemote' > /lokal/zieldatei_$(date "+%a").tar.gz Das > muss maskiert werden z. B. als '>' oder \>, sonst wird es lokal interpretiert und die Ausgabedatei wird lokal erzeugt und nicht remote.
Das ist genau das gewünschte Verhalten, wie plategt eingangs schrieb:
ich habe ein Backupscript laufen, welches von einem Remote-Server Dateien auf den lokalen Server kopiert und wöchentlich per Crontab ausgeführt wird.
fork991 schrieb:
ssh -i /serververbindung 'tar czvf - QuellordnerRemote' '>' /lokal/zieldatei_$(date "+%a").tar.gz
Das funktioniert nicht. Wenn, würde man es in die ersten Anführungsstriche hineinziehen, aber dann könnte man auch gleich den Namen angeben: ssh -i /serververbindung "tar czvf /lokal/zieldatei_$(date "+%a").tar.gz QuellordnerRemote" Aber, wie gesagt, das war nicht gewünscht.
|
plategt
(Themenstarter)
Anmeldungsdatum: 22. November 2012
Beiträge: 36
|
Bin leider erst jetzt dazu gekommen es zu implementieren. Falls jemand ähnliches vorhat, ich habe es jetzt mit Kalenderwochen und Zähler gelöst (und auch brav cat weggemacht 😉 ): #!/bin/bash
kw=$(date "+%V")
if (($kw%2 == 0))
then
zaehler=2
else
zaehler=1
fi
ssh -i /serververbindung 'tar czf - QuellordnerRemote' > /lokal/zieldatei_$(date "+%a")_$zaehler.tar.gz Danke nochmal für eure Hilfe. Gruß, plate
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Schön, dass du eine Lösung gefunden hast. Ich habe das ganze ähnlich sortiert, arbeite aber mit einem einfachen Symlink auf die aktuelle Sicherung, da ich von manchen Sicherungen auch mehrere aufhebe und die aktuelle nicht neu generiere, sondern per rsync nur inkrementell sichere. Der Nachteil sind einige Hardlinks pro Datei. Bedeutet: | heute=$(date +'%Y_%m_%d')
rsync -aR --numeric-ids --delete "${quelle}"/./ "${ziel}${heute}/" --link-dest="${ziel}_last/" && ln -nsf "${ziel}${heute}" "${ziel}_last"
|
heute ist mit angegeben, quelle und ziel dürfte klar sein 😉 Nach erfolgreicher Sicherung könntest du in deinem Fall alles löschen, was nicht mittels _last auf ein aktuelles Backup verweist. Ich behalte da immer etwas mehr.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Es wäre auch ganz einfach, eine existierende Backup-Lösung zu nehmen, wie z.B. Borg Backup. Damit kann man auch remote sichern und das recht effizient. Und einen Mechanismus zum Löschen nach bestimmten Kriterien gibt es auch. Hier würde man dann z.B. borg prune --keep-last 2 ... nehmen.
|
plategt
(Themenstarter)
Anmeldungsdatum: 22. November 2012
Beiträge: 36
|
rsync wär auch cool. Das Problem ist, soweit ich weiß muss rsync auf Quelle und Ziel vorhanden sein.
Es handelt sich hierbei jedoch um ein Backup von einem Webhosting-Server (Paket) auf ein QNAP NAS.
Das NAS würde rsync unterstützen, das Webhosting jedoch nicht. Das NAS bietet sogar eine Sync-Funktion per FTP, aber das dauert lange. Nach Stunden wurde noch nicht mal ein 1/3 gesynct. Ich weiß leider nicht warum. Mir ist zwar bekannt das FTP eher langsam ist. Aber ein GB düfte auch nicht länger als eine Stunde dauern?
|