Ganz einfach, ich habe einen Prozess, der ausgelöst wird, launchd
aber derzeit einmal pro Stunde ausgeführt wird, aber eigentlich möchte ich, dass er ausgeführt wird, sobald eine Time Machine-Sicherung abgeschlossen ist.
Anfangs dachte ich, ich könnte einfach mein Time Machine-Backup (/Volumes/Foo/Backups.backupdb/Haravikk's Mac) als Überwachungspfad für launchd festlegen, aber das scheint viel zu früh auszulösen. Es scheint gegen Ende wieder auszulösen, also verwende ich derzeit eine Verzögerung und überprüfe dann, ob ein .inprogress-Backup vorhanden ist, aber es ist nicht wirklich eine ideale Lösung, und manchmal löst die Bereinigungsphase von Time Machine den Prozess mehrmals aus .
Gibt es einen spezifischeren Pfad, den ich beobachten könnte, der meinen Prozess nur auslöst, wenn Time Machine ein Backup abgeschlossen hat?
Mir ist klar, dass ich meine Überprüfungen sowieso durchführen sollte, um sicherzugehen, aber derzeit wird mein Prozess mehrmals pro Sicherung ausgelöst, was nicht das ist, was ich möchte.
Eine einfache Lösung besteht darin, den Befehl zu verwenden tmutil
, um das Backup manuell auszulösen und es mit Ihrem Prozess zu verfolgen (als Teil eines Shell-Skripts, das diese beiden Schritte ausführt).
tmutil disable
tmutil startbackup --auto --block
diese Option, um einmal pro Stunde eine Sicherung auszulösen (die --block
Option ist erforderlich, damit die Ausführung warten muss, bis die Sicherung abgeschlossen ist).Weitere Informationen zur Verwendung über die Befehlszeile finden Sie unter man tmutil .Time Machine
Okay, nachdem ich einen Startagenten eingerichtet habe, um Informationen für eine Weile zu protokollieren, habe ich eine kombinierte Lösung entwickelt.
Ganz einfach, ich habe einen Launch-Agent erstellt, der die com.apple.TimeMachine.plist
Datei auf Updates wie folgt überwacht:
<?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>Label</key>
<string>org.example.backupd</string>
<key>ProgramArguments</key>
<array>
<string>do something</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Library/Preferences/com.apple.TimeMachine.plist</string>
</array>
</dict>
</plist>
Diese Datei wird jedes Mal aktualisiert, wenn Time Machine eine Sicherung durchführt, und läuft gegen Ende (ich glaube, während der Aufräum-/Beendigungsphase). Vor diesem Hintergrund ist es möglich, ein Skript mit dem obigen Überwachungspfad aufzurufen, das überprüft, ob backupd
es noch läuft. Wenn dies der Fall ist, schläft das Skript eine Minute lang und überprüft es erneut, wiederholt es, bis backupd
es fertig ist, bevor es mit dem fortfährt, was es tun muss.
Dadurch können jetzt Post-Backup-Aktionen ausgelöst werden, z. B. das Durchführen sekundärer Backups (in meinem Fall über rsync
ein NAS), das Überprüfen der Größe des letzten Backups und andere praktische Dinge.
Wie auch immer, diese Lösung scheint der beste Weg zu sein, da ich keinen zu beobachtenden Pfad finden konnte, der nach Abschluss einer Sicherung zuverlässig ausgelöst wird, aber dies sollte nahe genug am Ende einer Sicherung ausgeführt werden, um nützlich zu sein.
Haravikk
backupd
und einfach zu warten, bis es beendet ist, bevor ich mein Skript ausführe?MK
backupd
, aber es wird alle 10 Sekunden einmal ausgeführt und beendet. Eine Überwachung ist alsobackupd
nicht sinnvoll.