Есть ли команда bash, чтобы проверить, закончилась ли резервная копия Time Machine?

16

Я пишу сценарий, который будет rsycnc мой каталог Time Machine на удаленный сервер с помощью ssh. Я переключился с сценария оболочки на AppleScript, а затем снова на сценарий Apple, и мне все равно, какой сценарий потребуется для решения.

Я успешно запустил процесс резервного копирования с помощью этого небольшого фрагмента кода.

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

Сейчас я пытаюсь выполнить команду rsync после завершения резервного копирования. Есть ли в AppleScript чистый способ проверить, завершен ли процесс резервного копирования? Или есть хороший «крючок», который вы можете использовать в bash, чтобы проверить, завершен ли он?

whitneyz
источник
Я хотел бы спросить, почему бы просто не rsync оригинал - я спрашиваю это, насколько я понимаю, rsync не понимает каталоги жестких ссылок, так что в итоге вы получите несколько копий каждого файла.
user151019
Вы имеете в виду, что при каждом последующем резервном копировании Time Machine будет создавать резервную копию с жесткими ссылками на исходные файлы, которые уже были скопированы? Я спрашиваю об этом, потому что я не очень знаком с машиной времени. Если это так, то да, я бы скопировал оригинал. Но я почти уверен, что у rsync есть опция, которая заставит его игнорировать воссоздание жестких ссылок.
Уитниз
1
Да, именно так работает TM - rsync может понимать жесткие ссылки на файлы, но я не думаю, что t понимает жесткие ссылки на каталоги, которые являются уникальными для OSX с 10,5
user151019

Ответы:

4

Вот один из способов - я знаю, что это далеко не «правильное» решение, но я думаю, что оно сработает.

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

Он выполняет поиск в списке процессов для процесса backupd-helper, а затем отфильтровывает саму команду grep. Если команда возвращает> 0 результатов, процесс backupd-helper все еще активен. Если нет, процесс завершен, и вы можете предположить, что это сделано.

Харв
источник
1
...pgrep backupd-helper
Джейсон Салаз
1
Я нашел более элегантный способ! TIME_MACHINE_PID = $! подождите $ TIME_MACHINE_PID
whitneyz
1
@ whitneyz, пожалуйста, не могли бы вы уточнить, TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDможет быть, в отдельном ответе? Спасибо.
Грэм Перрин
18

tmutil status Теперь у Lion есть хороший инструмент для такого рода запросов.

На более новых ОС существует недокументированная команда, tmutil currentphaseкоторая показывает имя текущей фазы.

bmike
источник
Да - tmutuilтак полно побед, трудно выразить, как приятно смотреть и копаться в статусе резервной копии, статистике и программном управлении.
bmike
Сумасшедший, что это, по-видимому, без документов!
зигг
5

Вы также можете начать резервное копирование с tmutil startbackup -b. -bблокирует команду до завершения резервного копирования.

LRI
источник
3

tmutil status|grep -c "Running = 1"

возвращает «1» при работе, «0» при отсутствии.

Tadghostal66
источник
3

Отсутствие процессов, связанных с резервным копированием, не является гарантией того, что резервное копирование Time Machine завершено

На томе, на который Time Machine записывает свои резервные копии: рядом с /Latest/каталогом……, рассмотрим:

  • ... .inProgress/... связка

Если этот пакет существует, резервное копирование является неполным.

Грэм Перрин
источник
Обратите внимание, что даже если .inProgressкаталога нет , Time Machine все еще может быть занята подготовкой или приведением в порядок после резервного копирования (например, удаления старых резервных копий).
Gidds
1

Следующая работа для меня ...


Скрипт 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

Скрипт backup_wait:

    #!/usr/bin/env bash

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

user77052
источник
0

tmutilsсуществует только с 10.7. До этого вы можете использовать, как уже упоминалось, /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helperдля ручного запуска Time Machine.

Затем вы можете использовать, waitчтобы дождаться завершения процесса. Без аргументов это будет просто ждать; если вы предоставите PID, вы можете получить его возвращаемое значение (статус выхода).

В частности, wait $!будет ждать последний процесс, запущенный в этой оболочке. Однако, как упомянул Лаури, это ожидание вернется до того, как машина времени будет завершена, поскольку backupd-helper завершит работу до того, как будет выполнено резервное копирование. Мне не удалось найти имя процесса, которое указывало бы, что резервное копирование не было завершено.

Глядя на содержимое /var/logs/system.log (или через консоль), я заметил, что когда резервное копирование завершено, последнее, что нужно сделать, - это извлечь образ диска машины времени. Конечно же, я проверил, что (это OS X 10.6.8) во время резервного копирования есть /Volumes/Time Machine Backups. Таким образом, вы можете просто проверить, существует ли каталог. Когда это больше не происходит, Time Machine заканчивается.

Я не уверен, будет ли это работать для всех, так как я следовал приведенным здесь инструкциям для резервного копирования на компьютер с Windows в сети.

Дарда
источник