Gibt es einen Bash-Befehl, um zu überprüfen, ob Time Machine die Sicherung abgeschlossen hat?

Ich schreibe ein Skript, das mein Time Machine-Verzeichnis mit ssh auf einen Remote-Server rsycnc. Ich bin von einem Shell-Skript zu einem AppleScript und dann zurück zu einem Apple-Skript gewechselt, und es ist mir eigentlich egal, welche Art von Skript die Lösung benötigt.

Ich hatte Erfolg beim Starten des Backup-Prozesses mit diesem kleinen Code-Snippet.

do shell script "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper >/dev/null 2>&1 &"

Was ich jetzt versuche, ist, dass ein rsync-Befehl ausgeführt wird, sobald diese Sicherung abgeschlossen ist. Gibt es in AppleScript eine saubere Möglichkeit, um zu überprüfen, ob der Sicherungsvorgang abgeschlossen ist? Oder gibt es einen guten "Hook", den Sie in Bash verwenden können, um zu überprüfen, ob es abgeschlossen ist?

Ich würde fragen, warum nicht einfach das Original rsync - ich frage dies, soweit ich verstehe, dass rsync die Hardlink-Verzeichnisse nicht versteht, sodass Sie am Ende mehrere Kopien jeder Datei erstellen.
Meinen Sie damit, dass Time Machine bei jedem nachfolgenden Backup, das durchgeführt wird, ein Backup mit festen Links zu den bereits gesicherten Originaldateien erstellt? Ich frage das, weil ich mit Time Machine nicht so vertraut bin. Wenn das der Fall ist, dann ja, ich würde das Original kopieren. Aber ich bin mir ziemlich sicher, dass rsync eine Option hat, die dazu führt, dass es die Neuerstellung von harten Links ignoriert.
Ja, so funktioniert TM - rsync kann feste Dateiverknüpfungen verstehen, aber ich glaube nicht, dass es feste Verzeichnisverknüpfungen versteht, die seit 10,5 nur für OSX gelten

Antworten (7)

Hier ist ein Weg - ich weiß, dass es bei weitem keine "richtige" Lösung ist, aber ich stelle mir vor, dass es funktionieren würde.

ps ax | grep "/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper" | grep -v 'grep'

Es durchsucht die Prozessliste nach dem Prozess backupd-helper und filtert dann den grep-Befehl selbst aus der Anzeige heraus. Wenn der Befehl > 0 Ergebnisse zurückgibt, ist der Prozess backupd-helper noch aktiv. Ist dies nicht der Fall, ist der Vorgang beendet, und Sie können davon ausgehen, dass er abgeschlossen ist.

...pgrep backupd-helper
Ich habe einen eleganteren Weg gefunden! TIME_MACHINE_PID=$! warte $TIME_MACHINE_PID
@whitneyz könnten Sie das TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDvielleicht in einer separaten Antwort näher erläutern? Danke dir.

tmutil statusMit Lion haben wir nun übrigens ein nettes Tool für diese Art von Abfrage.

Auf neueren Betriebssystemen gibt es einen undokumentierten Befehl tmutil currentphase, der den Namen der aktuellen Phase anzeigt.

Ja – tmutuiles ist so voller Gewinn, dass es schwer zu beschreiben ist, wie schön es ist, einen Blick auf den Backup-Status, die Statistiken und die programmatische Steuerung zu werfen.
Verrückt, dass es anscheinend undokumentiert ist!

Sie können die Sicherung auch mit starten tmutil startbackup -b. -bblockiert den Befehl, bis die Sicherung abgeschlossen ist.

tmutil status|grep -c "Running = 1"

gibt '1' zurück, wenn es läuft, '0', wenn es nicht läuft.

Das Fehlen von sicherungsbezogenen Prozessen ist keine Garantie dafür , dass eine Time Machine-Sicherung vollständig ist

Auf dem Volume, auf das Time Machine seine Backups schreibt: neben dem /Latest/Verzeichnis … … Folgendes beachten:

  • das … .inProgress/… Bündel.

Wenn dieses Bundle vorhanden ist, ist eine Sicherung unvollständig.

Beachten Sie, dass Time Machine auch dann, wenn kein .inProgressVerzeichnis vorhanden ist, damit beschäftigt sein kann, ein Backup vorzubereiten oder danach aufzuräumen (z. B. alte Backups zu entfernen).

Folgendes funktioniert bei mir...


Skript backup_status:

    #!/usr/bin/env bash
    #
    # Determines if Time Machine is running and works with older Mac OS x versions
    #
    if [ x == x`type -P tmutil` ]; then
            # Older OSx
            count=`ps -ef | grep -v grep | grep -c 'CoreServices/backupd'`
            # Should also detect /Volume/Time Machine …/Latest/… directory ….inProgress/… bundle existence here to make it tight.
    else
            # OSx 10.7+
            count=`tmutil status | grep -c "Running = 1"`
    fi

    if [ $count == 0 ]; then
            echo stopped
    else
            echo running
    fi

Skript backup_wait:

    #!/usr/bin/env bash

    #
    # Waits for Time Machine backup to complete
    #
    while [ `backup_status` == running ] ; do
            sleep 2
    done

tmutilsexistiert erst ab 10.7. Davor können Sie, wie erwähnt, /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helperTime Machine manuell ausführen.

Sie können dann waitmit warten, bis der Vorgang abgeschlossen ist. Ohne Argumente wird es einfach warten; Wenn Sie die PID angeben, können Sie deren Rückgabewert (Ausgangsstatus) erhalten.

Insbesondere wait $!wird auf den letzten Prozess gewartet, der in dieser Shell gestartet wurde. Wie Lauri jedoch erwähnte, kehrt dieses Warten zurück, bevor die Zeitmaschine beendet ist, da backupd-helper beendet wird, bevor die Sicherung abgeschlossen ist. Ich konnte keinen Prozessnamen finden, der darauf hindeutet, dass die Sicherung nicht abgeschlossen war.

Beim Betrachten des Inhalts von /var/logs/system.log (oder über die Konsole) ist mir aufgefallen, dass nach Abschluss der Sicherung das letzte, was getan wird, darin besteht, das Festplatten-Image der Zeitmaschine auszuwerfen. Natürlich habe ich überprüft, dass (dies ist OS X 10.6.8) während der Sicherung eine /Volumes/Time Machine Backups. So können Sie einfach prüfen, ob das Verzeichnis existiert. Wenn dies nicht mehr der Fall ist, ist Time Machine beendet.

Ich bin mir nicht sicher, ob dies für alle funktioniert, da ich die Anweisungen hier befolgt habe, um auf einem Windows-Computer im Netzwerk zu sichern.