Scripten: NACH TM-Backup -> HD unmounten

Satho

Aktives Mitglied
Thread Starter
Dabei seit
29.04.2008
Beiträge
509
Reaktionspunkte
37
Hallo zusammen!

Mal eine Frage an die Scripter.
Ich habe von Scripten überhaupt gar keine Ahnung. Ich habe ein paar Sachen zusammengegoogelt, aber ich brauche trotzdem noch Eure Hilfe.

Mein Problem.
Ich habe eine FW-HD (Lacie) am iMac und nutze diese nur für TM.
Jetzt nervt es mich total, dass die Platte aus dem Standby hochfährt und rumrötelt, ohne dass TM etwas tut. Quasi, die Platte fährt zeit zu zeit einfach mal hoch und macht Nichts, außer Lärm.

Meine Idee:
Ein Script, dass mir die FW-HD nach dem Booten unmounted. Das ist kein Problem.

Dann ein zweites Script, dass ich automatisieren kann.
Ein Script, dass mir 1) die FW-Platte mounted, 2) TM-Backup startet und danach 3) die Platte wieder unmounted.


Mein Script:
tell application "Terminal"
do shell script "hdiutil attach /dev/disk1s3"
do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper"
do shell script "hdiutil detach /dev/disk1s3"
end tell
tell application "Terminal" to quit


Soweit so gut.
Die ersten zwei Schritte klappen bestens.
1) Die Platte mounted und 2) startet danach TM.
Allerdings möchte das Script die Platte dann gleich wieder 3) unmounten, obwohl ja TM noch zu Gange ist. Das geht natürlich nicht. Es kommt eine Fehlermeldung, dass das unmounten nicht funktioniert hat.

Meine Frage:
Gibt es einen Befehl oder eine Möglichkeit, dass er den dritten Schritt erst ausführt, wenn er mit dem zweiten Schritt fertig ist?
 
Zuletzt bearbeitet:
Hmm wenn Du es so machen willst, dann sollte so etwas gehen:
...
...
do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper" && "hdiutil detach /dev/disk1s3"
end tell
...

Das 2-te wird nur dann ausgeführt wenn vom ersten also "backup-..." ein RC 0 kommt.
 
Danke für Deine Antwort.
Also wenn ich das richtig verstehe, fasse ich die letzten beiden Befehle mit " && " zusammen. Damit wird der zweite Befehl erst nach Vollendung des ersten Befehls ausgeführt.

Aber wenn ich das " && " eingebe erscheint ein Syntaxfehler: "Es wurde „Ausdruck“ erwartet, aber ein „„&““ wurde gefunden." ?


tell application "Terminal"
do shell script "hdiutil attach /dev/disk1s3"
do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper" && "hdiutil detach /dev/disk1s3"
end tell
tell application "Terminal" to quit
 
Da meine ext. HDD klackert wie sonst keiner im Dorf, wäre ich auch um eine Lösung glücklich.

Könntet Ihr mir die fertige Lösung posten, laienkompatibel?

Danke sagt Michael aus der Hauptstadt des schönsten Bundeslandes der Welt
 
So, nach weiterem Googeln...

Soweit ich das verstanden habe, wird normalerweise jeder Befehl nacheinander ausgeführt und erst wenn der Aktuelle beendet ist, startet der Nächste. Also müsste es ja auch so funktionieren.
Mit & startet man parallel Befehle und && geht wohl hier bei Apple-Script nicht?
Ich dachte mir, da die Befehle ja von Haus aus nacheinander abgearbeitet werden und es hier im dritten Schritt mit dem Unmounten verhaut. Liegt es vielleicht daran, dass die Abfolge bzw. der Zeitraum zwischen Schritt 2 und Schritt 3 zu kurz ist und es deshalb nicht funktioniert.
Ich habe mit Delay einen Puffer von ein paar Sekunden eingebaut und die ersten Versuche haben jetzt wunderbar funktioniert.


tell application "Terminal"
do shell script "hdiutil attach /dev/disk1s3"
do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper"
delay 8
do shell script "hdiutil detach /dev/disk1s3"
end tell
tell application "Terminal" to quit
 
Zuletzt bearbeitet:
Geht doch net.... schmeisst die Platte raus, obwohl er noch mit dem Backup beschäftigt ist.

Keine Ahnung wie es machbar ist. :-(
 
Ums mal vorauszuschicken: Ich habe genauso wenig Ahnung wie du, aber wie wäre was in folgender Art:

Code:
repeat
tell application "System Events"
if exists application process "[I]DeinBackupprogramm[/I]" then
delay 1
set CheckVar to true
else
do shell script "diskutil unmount /Volumes/[I]Name des Volumes[/I]"
set CheckVar to false
end if
end tell
if (CheckVar = false) then exit repeat
end repeat
 
Hallo Pill,
danke für Deine Hilfe.
Allerdings geht es so auch nicht. Beim Testlauf hat er das Volume kurz nach dem Start des Backups ausgeworfen, also mitten während dem Backup.
 
Ich hätte da noch eine Idee. Da das mit dem Überprüfen, ob das Programm noch am Laufen ist nicht funktioniert.

1) Backup mounten
2) Eine Schleife, in der überprüft wird, ob sich die Größe oder ob sich etwas am Speicherplatz auf dem Bakup-Volume verändert.
Wenn ja, dann springt er halt zurück und wenn sich nichts mehr ändert, geht es weiter zu Schritt 3.
3) unmounten


Zu Schritt 2: Könnte Das jemand von den Profis mal vormachen? Bitte :)
 
Danke Madu.

Jetzt kommt hierbei keine Fehlermeldung.
Aber das gleiche Problem wie Anfangs. Während er noch mit dem Backup zugange ist wirft er das Volume bereits aus.


tell application "Terminal"
do shell script "hdiutil attach /dev/disk1s3"
do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper && hdiutil detach /dev/disk1s3"
end tell
tell application "Terminal" to quit




Ich glaube die beste Idee wäre noch die Geschichte mit dem Überprüfen, ob sich etwas vom Speicherplatz am Volume ändert.
 
Soweit ich das verstanden habe, wird normalerweise jeder Befehl nacheinander ausgeführt und erst wenn der Aktuelle beendet ist, startet der Nächste

Auch wenn ich noch weniger Ahnung habe wie du:
Kann es sein, dass der den nächsten Befehl ausführt, sobald der vorherige ausgeführt wurde.
Ich meine, das Skript startet das ganze ja nur. Wenn das Skript das Programm gestartet hat, so hat das Programm ja seine Aufgabe erledigt
und die nächste Aufgabe wird ausgeführt. In deinem Fall dann das rausschmeißen der Platte.

Hab ich mich einigermaßen verständlich ausgedrückt?

Zu deinem letzte Lösungsansatz:
Da müsstest du dann ja auch nen delay zwischen packen.
Also bei Zeitpunkt A Festplattenplatz speichern , delay x , Zeitpunkt B Festplattenplatz mit Zeitpunkt A vergleichen.
 
Ja, so sehe ich das auch. Er wartet ja nicht bis das Programm wieder beendet wurde.

&& zwischen zwei Befehlen, der zweite Befehl wird ausgeführt, wenn der erste erfolgreich war.

Der erste Befehl startet nur das Programm. Danach geht's zu Schritt 3.

Der Lösungsvorschlag von Pill mit der Überprüfung, ob das Programm noch läuft hat leider nicht geklappt.
 
Hab mir das Ganze nicht näher angesehen, war nur kurz auf Deine besagte Fehlermeldung eingegangen.

Als Quick&Dirty-Lösung könntest Du auch einfach das Delay auf paar Minuten hochsetzen. Kannst ja mal beobachten wie lange TM maximal für seine Backups braucht (das variiert, je nach dem wenn es noch Backups optimiert und zusammenführt).
Bestimmt gäb's ne schönere und sauberere Lösung, hab aber grad keine Zeit das näher zu eruieren.

Ahja, die ganzen tell-statements kannste weglassen.
"do shell script" reicht völlig.
 
Ja das war auch eine Überlegung.
Allerdings ist die Dauer ganz unterschiedlich. Je nachdem ob (fast) Nichts geändert wurde oder vielleicht ein paar neue Alben in iTunes dazu gekommen sind, macht es schon einiges aus.
Daher wollte ich diese Lösung, einfach ein paar Minuten das Ganze laufen lassen, nicht in Betracht ziehen.

hmmm....
 
Time Machine erstellt ja auf dem Schreibtisch eine Datei "Time Machine-Backups". Vielleicht könnte man einfach prüfen ob diese Datei vorhanden ist:

Code:
delay 60
set path to "/Users/Username/Desktop/Time/ Machine-Backups"

try
    POSIX file (path) as alias
    set file_exists to true
on error
    set file_exists to false
end try
if file_exists = false then
    do shell script "diskutil unmount /Volumes/NamedesVolumes"
end if

Das ganze sollte verspätet anfangen (delay 60 oder so), weil es die Datei am Anfang noch nicht gibt. Und dann halt solange prüfen lassen, bis die Datei verschwunden ist, dann müsste er auch mit dem Backup fertig sein.
 
Nein, er erstellt nicht extra ein File auf dem Schreibtisch.
Normalerweise wird immer das Backupvolume auf dem Schreibtisch angezeigt.
In dem Volume ist der Ordner "Backups.backupdb". In diesem ist ein weiterer Ordner mit dem Computernamen und in dem sind die ganzen Backups.

Wenn ich das Script dann richtig interpretiere fragt er hierbei ab, ob der Path gültig ist und erst wenn nicht, wirft er das Volume raus.

Das wird aber so nicht funktionieren. Wie gesagt, weil er keine Datei erstellt.
Er mounted die Platte und in deren Unterordner erstellt er die Backups.
(Normalerweise ist die Platte immer auf dem Schreibtisch. Wenn man Timemachine mit einer ext. Festplatte via FW oder USB nutzt. Bei TimeCapsule ist das glaube ich anders. Dann hat er die Platte erst auf dem Schreibtisch angezeigt, wenn das Backup los ging. (Wenn ich mich noch richtig erinnere, da ich keine TC mehr habe.) Dann würde es so gehen.
 
Time Machine erstellt ja auf dem Schreibtisch eine Datei "Time Machine-Backups".

Hä?? :confused:
So eine Datei hab ich nie gesehen noch davon gehört...
(übrigens selbst wenn, wäre Dein Pfad falsch: "/Time/ Machine")

Der beste Ansatz ist wohl über die Prüfung, ob backupd als Prozess noch aktiv ist, wie früher schon mal in einem Post angedeutet.
 
Es gibt einen langen Beitrag zum Thema "Prüfen ob TimeMachine läuft" bei Macscripter (dem besten AppleScript-Forum im WWW): http://macscripter.net/viewtopic.php?id=29626

Außerdem habe ich folgenden Codeschnipsel ergoogelt, der in die gleiche Richtung geht:
PHP:
if IsProcRunning("backupd") then
set app_is_up to true
else
set app_is_up to false
end if
if app_is_up then
display alert "TM is Running."
else
display alert "TM is not Running."
end if

on IsProcRunning(theProc)
try
do shell script "ps auxc | grep \"" & theProc & "\""
return true
on error
return false
end try
end IsProcRunning
Praktisch wird mittels Shell die Liste der laufenden Prozesse nach TimeMachine durchsucht - das ganze muß natürlich innerhalb eines return-Loops ablaufen, der sich alle 10? 15? Sekunden wiederholt, bis TM fertig ist, dann kann wie in Deinem Script die Festplatte abgehängt werden.

Habe im Moment leider weder einen Mac noch TimeMachine zur Hand, aber den Autoren bei Macscripter darf man bedenkenlos aufs Wort glauben.

Good scripting
Farid
 
Zurück
Oben Unten