¿Hay un comando bash para verificar si Time Machine ha terminado de realizar una copia de seguridad?

16

Estoy escribiendo un script que rsycnc mi directorio de Time Machine a un servidor remoto usando ssh. Cambié de un script de shell a un AppleScript y luego volví a un script de Apple y realmente no me importa qué tipo de script requerirá la solución.

He tenido éxito al iniciar el proceso de copia de seguridad con este pequeño fragmento de código.

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

Lo que intento hacer ahora es ejecutar un comando rsync una vez que se complete la copia de seguridad. ¿Hay alguna forma limpia en AppleScript para verificar si el proceso de copia de seguridad se ha completado? ¿O hay un buen "gancho" que puede usar en bash para verificar si está completo?

Whitneyz
fuente
Preguntaría por qué no solo rsync el original: pregunto esto hasta donde entiendo rsync no entiende los directorios de enlaces duros, por lo que terminará tomando múltiples copias de cada archivo.
user151019
¿Quiere decir que con cada copia de seguridad sucesiva que se realice, Time Machine generará una copia de seguridad con enlaces duros a los archivos originales que ya han sido respaldados? Pregunto esto porque no estoy tan familiarizado con Time Machine. Si ese es el caso, entonces sí, copiaría el original. Pero estoy bastante seguro de que rsync tiene una opción que hará que ignore la recreación de enlaces duros.
whitneyz
1
Sí, así es como funciona TM: rsync puede entender los enlaces de archivos duros, pero no creo que entienda los enlaces de directorios duros que son exclusivos de OSX desde 10,5
user151019

Respuestas:

4

Aquí hay una forma: sé que no está cerca de una solución "adecuada", pero imagino que funcionaría.

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

Lo que hace es buscar en la lista de procesos el proceso de copia de seguridad auxiliar, luego filtra el comando grep para que no aparezca. Si el comando devuelve> 0 resultados, el proceso de copia de seguridad auxiliar todavía está activo. De lo contrario, el proceso ha finalizado, por lo que puede suponer que está hecho.

Harv
fuente
1
...pgrep backupd-helper
Jason Salaz
1
¡Encontré una manera más elegante! TIME_MACHINE_PID = $! esperar $ TIME_MACHINE_PID
whitneyz
1
@whitneyz, por favor, ¿podría dar más detalles TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDtal vez en una respuesta separada? Gracias.
Graham Perrin el
18

tmutil status es la forma de Lion ahora que tenemos una buena herramienta para este tipo de consulta.

En el sistema operativo más reciente, hay un comando no documentado tmutil currentphaseque muestra el nombre de la fase actual.

bmike
fuente
Sí, tmutuilestá tan lleno de victorias que es difícil expresar lo bueno que es echar un vistazo al estado de la copia de seguridad, las estadísticas y conducir cosas programáticamente.
bmike
¡Loco que aparentemente no está documentado!
zigg
5

También puede iniciar la copia de seguridad con tmutil startbackup -b. -bbloquea el comando hasta que finalice la copia de seguridad.

Lri
fuente
3

tmutil status|grep -c "Running = 1"

devuelve '1' cuando se ejecuta, '0' cuando no.

Tadghostal66
fuente
3

La ausencia de procesos relacionados con la copia de seguridad no garantiza que se complete una copia de seguridad de Time Machine

En el volumen en el que Time Machine escribe sus copias de seguridad: junto con el /Latest/directorio ... ..., considere:

  • el ... .inProgress/... paquete.

Si ese paquete existe, una copia de seguridad está incompleta.

Graham Perrin
fuente
Tenga en cuenta que incluso si no hay un .inProgressdirectorio, Time Machine puede estar ocupado preparándose o arreglando después de una copia de seguridad (por ejemplo, eliminando copias de seguridad antiguas).
Gidds
1

El siguiente trabajo para mí ...


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

usuario77052
fuente
0

tmutilssolo existe desde 10.7 en adelante. Antes de eso, puede usar, como se mencionó, /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helperpara ejecutar Time Machine manualmente.

Luego puede usar waitpara esperar hasta que el proceso haya finalizado. Sin argumentos simplemente esperará; si proporciona el PID, puede obtener su valor de retorno (estado de salida).

Particularmente, wait $!esperará el último proceso iniciado en ese shell. Sin embargo, como mencionó Lauri, esta espera volverá antes de que la máquina del tiempo finalice porque el asistente de respaldo finaliza antes de que finalice el respaldo. No pude encontrar ningún nombre de proceso que indicara que la copia de seguridad no estaba completa.

Al mirar el contenido de /var/logs/system.log (o mediante la Consola), noté que cuando finaliza la copia de seguridad, lo último que se hace es expulsar la imagen del disco de la máquina del tiempo. Efectivamente, verifiqué que (esto es OS X 10.6.8) durante la copia de seguridad hay un /Volumes/Time Machine Backups. Por lo tanto, simplemente puede verificar si el directorio existe. Cuando ya no lo hace, Time Machine está terminado.

No estoy seguro de si esto funcionará para todos, ya que he seguido las instrucciones aquí para hacer una copia de seguridad en una máquina Windows en la red.

Darda
fuente