Vollautomatische Backups

Atalantia

Atalantia

Aktives Mitglied
Thread Starter
Dabei seit
26.11.2009
Beiträge
1.894
Reaktionspunkte
432
Hallo Leute,
ich habe schon viele Probleme dank diesem Forums lösen können. Als Dankeschön möchte ich Euch eine Methode zeigen, wie Ihr vollautomatische Backups ohne GUI machen könnt.

Als erstes legt Ihr mit AppleScript-Editor folgendes Script an:

Code:
if (list disks) contains "NameDerQuellenHD" and (list disks) contains "NameDerZielHD" then
	delay 40
	(*Es wird geprüft ob die Datenträger für das Quellverzeichnis und Zielverzeichnis aktiviert sind. NameDerQuellenHD und NameDerZielHD müsst ihr mit den Namen von Eueren HD's ersetzen. delay 40 wartet 40sec. bevor der weitere Code ausgeführt wird. Ihr könnt Ihn nach Gutdünken ändern.
*)
	try
		do shell script "rsync -a --delete /Volumes/NameDerQuellenHD/NameDesQuellOrdners /Volumes/NameDerZielHD"
	on error errStr
		display alert errStr as critical
	end try
	(* Hier wird der eigentliche Backupvorgang ausgeführt rsync -a --delete. Das delete löscht alle Dateien im ZielOrdner die im QuellOrdner nicht vorhanden sind. Möchte man das nicht, einfach --delete löschen. Dann werden alle Dateien im ZielOrdner behalten auch wenn sie im QuellOrdner nicht mehr vorhanden sind. Ein Ordner mit gleichem Namen wird auf der ZielHD angelegt. Er muss also nach /Volumes/NameDerZielHD nicht definiert werden. Wenn was schief geht (Zugriffsrechte z.B.) wird ein Dialog gezeigt, display alert.
*)
end if

Danach könnt Ihr daraus entweder eine App oder Script machen, beim Sichern in Applescript. Um es aber wirklich vollautomatisch auszuführen müssen wir es als Script sichern und zusätzlich mit TextEdit als reiner Text ein Launchd plist mit folgendem Inhalt erzeugen: (alternativ kann man auch LaunchControl oder Lingon benutzen)
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>EnableGlobbing</key>
	<true/>
	<key>Label</key>
	<string>SyncScript</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/bin/osascript</string>
		<string>~/PfadZumScript/NameDesScript.scpt</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>StartInterval</key>
	<integer>14400</integer>
	<key>StartOnMount</key>
	<true/>
</dict>
</plist>
Achtung! PfadZumScript und NameDesScript.scpt müsst Ihr ersetzen mit dem Pfad und Namen Eueres Scripts. Das launchd File muss die Endung .plist haben und im Ordner ~/Library/LaunchAgents gespeichert sein. Danach ausloggen und wieder einloggen und das Script läuft.
Jetzt wird jedesmal wenn ein Volume aktiviert wird, geprüft ob beide Volumen aktiv sind. Wenn ja, wird das Backup ausgeführt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: madu
ist das beim ersten mal ein vollbackup und danach inkrementell?
liegt ja rsync darunter, könnte ja sein.
 
Das Skript nimmt keine Versionierung vor sondern ersetzt das alte durch das neue Backup.
 
gute arbeit und dank dafür
ich bleibe aber bei ccc
 
Ja, es macht ein "simples" Backup. Ist eine Datei neuer als die Vorhandene wird sie ersetzt. Ich brauche es für Software Backups und um meine Tutorial Sammlung zu Backupen.
 
Zuletzt bearbeitet:
Ist eine Datei neuer als die Vorhandene wird sie ersetzt.
So ganz "simpel" ist das dann aber keineswegs. "Simpel" würde einfach kopiert und überschrieben, auch wenn die Datei nicht geändert wurde.
Ich bleibe zwar lieber bei TimeMachine, aber für einige externe Platten, bei denen Versionen völlig überflüssig sind, werde ich diese überzeugend einfache Lösung mal testen.
Besten Dank!
 
Ich habe auch TimeMachine um die interne HD zu sichern. "Meine Erfindung" nehme ich um zwei externe HD's abzugleichen bzw. bestimmte Inhalte davon.

PS: Ich habe im Launchd oben nachträglich noch ein Startintervall eingebaut. Das Script wird so zusätzlich noch alle 4 Stunden gestartet.

Code:
...
	<key>StartInterval</key>
	<integer>14400</integer>
...
 
Zuletzt bearbeitet:
Hier das AppleScript noch etwas besser. Es erzeugt etwas weniger Prozessorlast. Unwesentlich aber doch etwas.

Code:
set diskNames to list disks
if diskNames contains "NameDerQuellenHD" and diskNames contains "NameDerZielHD" then	
delay 40
	(*Es wird geprüft ob die Datenträger für das Quellverzeichnis und Zielverzeichnis aktiviert sind. NameDerQuellenHD und NameDerZielHD müsst ihr mit den Namen von Eueren HD's ersetzen. delay 40 wartet 40sec. bevor der weitere Code ausgeführt wird. Kann nach Gutdünken geändert werden.
*)
	try
		do shell script "rsync -a --delete /Volumes/NameDerQuellenHD/NameDesQuellOrdners /Volumes/NameDerZielHD"
	on error errStr
		display alert errStr as critical
	end try
	(* Hier wird der eigentliche Backupvorgang ausgeführt rsync -a --delete. Das delete löscht alle Dateien im ZielOrdner die im QuellOrdner nicht vorhanden sind. Möchte man das nicht, einfach --delete löschen. Dann werden alle Dateien im ZielOrdner behalten auch wenn sie im QuellOrdner nicht mehr vorhanden sind. Ein Ordner mit gleichem Namen wird auf der ZielHD angelegt. Er muss also nach /Volumes/NameDerZielHD nicht definiert werden. Wenn was schief geht (Zugriffsrechte z.B.) wird ein Dialog gezeigt, display alert.
*)
end if
 
Zuletzt bearbeitet:
Hi

in der 2. Variante kann ein Fehler auftreten, denn
Code:
[B]if[/B] [COLOR=#528f1f]diskNames[/COLOR] [B]contains[/B] {"NameDerQuellenHD", "NameDerZielHD"} [B]then[/B]
ist nur dann wahr, wenn die beiden HDDs in dieser Reihenfolge in discNames enthalten sind.

Du solltest daher besser
Code:
[B]if[/B] [COLOR=#528f1f]diskNames[/COLOR] [B]contains[/B] "NameDerQuellenHD" [B]and[/B] [COLOR=#528f1f]diskNames[/COLOR] [B]contains[/B] "NameDerZielHD" [B]then[/B]
verwenden.

Ansonsten schönes Tutorial :)
 
Hi

in der 2. Variante kann ein Fehler auftreten, denn
Code:
[B]if[/B] [COLOR=#528f1f]diskNames[/COLOR] [B]contains[/B] {"NameDerQuellenHD", "NameDerZielHD"} [B]then[/B]
ist nur dann wahr, wenn die beiden HDDs in dieser Reihenfolge in discNames enthalten sind.

Du solltest daher besser
Code:
[B]if[/B] [COLOR=#528f1f]diskNames[/COLOR] [B]contains[/B] "NameDerQuellenHD" [B]and[/B] [COLOR=#528f1f]diskNames[/COLOR] [B]contains[/B] "NameDerZielHD" [B]then[/B]
verwenden.

Ansonsten schönes Tutorial :)

Danke, ich habe es in Beitrag #8 geändert, damit niemand in die Falle tritt ;)

PS: Mit...
Code:
rsync -a --delete --log-file=/Users/xyz/Library/Logs/rsync.log /Volumes/NameDerQuellenHD/NameDesQuellOrdners /Volumes/NameDerZielHD"
...kann man zusätzlich ein Logfile schreiben lassen. xyz muss natürlich mit Euerem Accountnamen ersetzt werden.
Das Logfile richtig zu interpretieren ist dann aber 'ne andere Sache. Eine Legende dazu habe ich hier gefunden.
 
Zuletzt bearbeitet:
Ich kann aus den LogFiles lesen, dass der Syncvorgang jede Stunde abläuft und zwar immer wenn TimeMachine seine Backups macht. Daraus schliesse ich, dass Launchd jedesmal mal einen Mount aufruf erhält, wenn Ti.Ma anspringt. Ti.Ma ist bei mir ne verschlüsselte HD. Möglicherweise wird das Volumen jedesmal gemountet wenn ein Backup anspringt. Ich weiss es nicht. Ich habe also das launchd plist im LaunchAgents Ordner folgendermassen geändert:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>EnableGlobbing</key>
	<true/>
	<key>Label</key>
	<string>SyncScript</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/bin/osascript</string>
		<string>~/PfadZumScript/NameDesScript.scpt</string>
	</array>
	<key>StartInterval</key>
	<integer>14400</integer>
</dict>
</plist>

Die Zeilen:
<key>StartOnMount</key>
<true/>
und
<key>RunAtLoad</key>
<true/>
sind gelöscht. Der Befehl:
<key>StartInterval</key>
<integer>14400</integer>
führt den Start alle 4 Stunden aus und wenn der Computer länger ausgeschaltet war, gleich nach dem Einloggen. Sollte genügen.
PS: Started aber nicht beim einstöpseln der HD. grnff. Ich werde noch nach einer besseren Lösung suchen.
 
Zuletzt bearbeitet:
Zurück
Oben Unten