Existe um comando bash para verificar se o Time Machine terminou o backup?

16

Estou escrevendo um script que irá rsycnc meu diretório do Time Machine para um servidor remoto usando ssh. Mudei de um script de shell para um AppleScript e, em seguida, voltei para um script da Apple e realmente não me importo com o tipo de script que a solução exigirá.

Tive sucesso ao iniciar o processo de backup com este pequeno trecho de código.

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

O que estou tentando fazer agora é executar um comando rsync assim que o backup for concluído. Existe alguma maneira limpa no AppleScript para verificar se o processo de backup foi concluído? Ou existe um bom "gancho" que você pode usar no bash para verificar se está completo?

whitneyz
fonte
Eu perguntaria por que não apenas rsync o original - eu pergunto isso até onde eu entendo rsync não entende os diretórios de link físico, para que você acabe tirando várias cópias de cada arquivo.
user151019
Você quer dizer que, com cada backup sucessivo realizado, o Time Machine irá gerar um backup com links físicos para os arquivos originais que já foram salvos em backup? Eu pergunto isso porque não estou familiarizado com o Time Machine. Se for esse o caso, sim, eu copio o original. Mas tenho certeza de que o rsync tem uma opção que fará com que ele ignore a recriação de links físicos.
whitneyz
11
Sim, é assim que a TM funciona - o rsync pode entender os links de arquivos
físicos

Respostas:

4

Aqui está uma maneira: eu sei que não é nem de longe uma solução "adequada", mas imagino que funcionaria.

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

O que ele faz é procurar na lista de processos pelo processo backupd-helper e, em seguida, filtra o próprio comando grep de aparecer. Se o comando retornar> 0 resultados, o processo backupd-helper ainda estará ativo. Caso contrário, o processo terminou e, portanto, você pode assumir que está concluído.

Harv
fonte
11
...pgrep backupd-helper
Jason SALAZ
11
Eu encontrei uma maneira mais elegante! TIME_MACHINE_PID = $! wait $ TIME_MACHINE_PID
whitneyz
11
@ whitneyz por favor, você poderia elaborar TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDtalvez em uma resposta separada? Obrigado.
Graham Perrin
18

tmutil status é a maneira Lion agora que temos uma boa ferramenta para esse tipo de consulta.

No sistema operacional mais recente, há um comando não documentado tmutil currentphaseque mostra o nome da fase atual.

bmike
fonte
Sim - tmutuilé tão cheio de vitórias, é difícil expressar como é bom espiar e cutucar o status de backup, estatísticas e conduzir as coisas de maneira programática.
Bmike
Louco que aparentemente não esteja documentado!
Zigg 16/10
5

Você também pode iniciar o backup com tmutil startbackup -b. -bbloqueia o comando até que o backup seja concluído.

Lri
fonte
3

tmutil status|grep -c "Running = 1"

retorna '1' ao executar, '0' quando não.

Tadghostal66
fonte
3

Ausência de processos relacionados ao backup é não garante que um backup do Time Machine esteja completo

No volume em que o Time Machine grava seus backups: ao lado do…/Latest/ diretório……, considere:

  • o ... .inProgress/... pacote.

Se esse pacote existir, um backup está incompleto.

Graham Perrin
fonte
Observe que, mesmo que não haja .inProgressdiretório, o Time Machine ainda pode estar ocupado se preparando ou arrumando após um backup (por exemplo, removendo backups antigos).
Gidds
1

O seguinte trabalho para mim ...


Script 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

Script backup_wait:

    #!/usr/bin/env bash

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

user77052
fonte
0

tmutilssó existe a partir de 10.7. Antes disso, você pode usar, como mencionado,/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper para executar manualmente o Time Machine.

Você pode então usar wait esperar até o processo terminar. Sem argumentos, simplesmente esperará; se você fornecer o PID, poderá obter seu valor de retorno (status de saída).

Particularmente, wait $! aguardará o último processo iniciado nesse shell. No entanto, como Lauri mencionou, essa espera retornará antes do término da máquina porque o backupd-helper termina antes que o backup seja concluído. Não consegui encontrar nenhum nome de processo que indicava que o backup não estava completo.

Observando o conteúdo de /var/logs/system.log (ou através do console), notei que, quando o backup é concluído, a última coisa a ser feita é ejetar a imagem de disco da máquina do tempo. Com certeza verifiquei que (este é o OS X 10.6.8) durante o backup, existe um /Volumes/Time Machine Backups. Assim, você pode simplesmente verificar se o diretório existe. Quando isso não acontece, o Time Machine está concluído.

Não tenho certeza se isso funcionará para todos, pois segui as instruções aqui para fazer backup em uma máquina Windows na rede.

darda
fonte