Czy istnieje polecenie bash, aby sprawdzić, czy Time Machine zakończyło tworzenie kopii zapasowej?

16

Piszę skrypt, który rsycnc mój katalog Time Machine na zdalny serwer za pomocą ssh. Zmieniłem skrypt skryptowy na AppleScript, a potem z powrotem na skrypt Apple i nie obchodzi mnie, jakiego rodzaju skrypt będzie wymagał tego rozwiązania.

Udało mi się rozpocząć proces tworzenia kopii zapasowej za pomocą tego małego fragmentu kodu.

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

Teraz próbuję wykonać polecenie rsync po zakończeniu tworzenia kopii zapasowej. Czy jest jakiś czysty sposób w AppleScript, aby sprawdzić, czy proces tworzenia kopii zapasowej jest zakończony? A może jest dobry „haczyk”, którego można użyć w bash, aby sprawdzić, czy jest zakończony?

whitneyz
źródło
Chciałbym zapytać, dlaczego nie tylko zsynchronizować oryginał - pytam o to, o ile rozumiem, rsync nie rozumie katalogów linków twardych, abyś mógł w końcu wziąć wiele kopii każdego pliku.
user151019,
Czy masz na myśli, że z każdą kolejną tworzoną kopią zapasową Time Machine będzie generować kopię zapasową z twardymi linkami do oryginalnych plików, które zostały już utworzone? Pytam o to, ponieważ nie znam się na Wehikule Czasu. Jeśli tak, to tak, skopiowałbym oryginał. Ale jestem całkiem pewien, że rsync ma opcję, która spowoduje, że zignoruje odtwarzanie twardych dowiązań.
whitneyz
1
Tak, tak działa TM - rsync może zrozumieć twarde linki do plików, ale nie sądzę, że t rozumie twarde linki do katalogów, które są unikalne dla OSX od 10,5
użytkownik151019,

Odpowiedzi:

4

Oto jeden sposób - wiem, że nie jest to „właściwe” rozwiązanie, ale wyobrażam sobie, że to zadziała.

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

Przeszukuje listę procesów pod kątem procesu tworzenia kopii zapasowej, a następnie odfiltrowuje samą komendę grep. Jeśli polecenie zwróci> 0 wyników, proces tworzenia kopii zapasowej jest nadal aktywny. Jeśli nie, proces się zakończył, więc możesz założyć, że został zakończony.

Harv
źródło
1
...pgrep backupd-helper
Jason Salaz,
1
Znalazłem bardziej elegancki sposób! TIME_MACHINE_PID = $! poczekaj $ TIME_MACHINE_PID
whitneyz
1
@whiteneyz, czy mógłbyś rozwinąć TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDmoże w osobnej odpowiedzi? Dziękuję Ci.
Graham Perrin
18

tmutil status jest sposobem na lew, teraz, gdy mamy fajne narzędzie do tego rodzaju zapytań.

W nowszym systemie operacyjnym istnieje nieudokumentowane polecenie, tmutil currentphasektóre pokazuje nazwę bieżącej fazy.

bmike
źródło
Tak - tmutuiljest tak pełen zwycięstwa, że ​​trudno jest wyrazić, jak miło jest zerknąć i szturchać status tworzenia kopii zapasowych, statystyki i prowadzić programowo.
bmike
Szalony, że to pozornie nieudokumentowane!
zigg
5

Możesz także rozpocząć tworzenie kopii zapasowej za pomocą tmutil startbackup -b. -bblokuje polecenie do momentu zakończenia tworzenia kopii zapasowej.

Lri
źródło
3

tmutil status|grep -c "Running = 1"

zwraca „1”, gdy działa, „0”, gdy nie.

Tadghostal66
źródło
3

Brak procesów związanych z tworzeniem kopii zapasowych nie gwarantuje pełnego wykonania kopii zapasowej Time Machine

Na woluminie, na którym Time Machine zapisuje swoje kopie zapasowe: obok /Latest/katalogu…… rozważ:

  • w ... .inProgress/... pakiet.

Jeśli ten pakiet istnieje, kopia zapasowa jest niekompletna.

Graham Perrin
źródło
Pamiętaj, że nawet jeśli nie ma .inProgresskatalogu, Time Machine może być nadal zajęty przygotowywaniem lub porządkowaniem po utworzeniu kopii zapasowej (np. Usuwanie starych kopii zapasowych).
gidds
1

Następująca praca dla mnie ...


Skrypt 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

Skrypt backup_wait:

    #!/usr/bin/env bash

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

użytkownik77052
źródło
0

tmutilsistnieje tylko od 10.7. Wcześniej można używać, jak wspomniano, /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helperdo ręcznego uruchamiania Time Machine.

Następnie możesz użyć, waitaby poczekać, aż proces się zakończy. Bez argumentów będzie po prostu czekać; jeśli podasz PID, możesz uzyskać jego wartość zwracaną (status wyjścia).

W szczególności wait $!będzie czekał na ostatni proces rozpoczęty w tej powłoce. Jednak, jak wspomniał Lauri, to oczekiwanie powróci przed ukończeniem wehikułu czasu, ponieważ pomocnik kopii zapasowej kończy się przed utworzeniem kopii zapasowej. Nie udało mi się znaleźć żadnej nazwy procesu wskazującej, że tworzenie kopii zapasowej nie zostało zakończone.

Przeglądając zawartość pliku /var/logs/system.log (lub poprzez konsolę) zauważyłem, że po zakończeniu tworzenia kopii zapasowej ostatnią rzeczą, którą należy zrobić, jest wysunięcie obrazu dysku wehikułu czasu. Rzeczywiście sprawdziłem, czy (jest to OS X 10.6.8) podczas tworzenia kopii zapasowej /Volumes/Time Machine Backups. W ten sposób możesz po prostu sprawdzić, czy katalog istnieje. Gdy przestaje działać, Time Machine jest skończona.

Nie jestem pewien, czy to zadziała dla wszystkich, ponieważ wykonałem instrukcje tutaj, aby wykonać kopię zapasową na komputerze z systemem Windows w sieci.

darda
źródło