Existe-t-il une commande bash pour vérifier si Time Machine a terminé la sauvegarde?

16

J'écris un script qui va rsycnc mon répertoire Time Machine sur un serveur distant en utilisant ssh. Je suis passé d'un script shell à un AppleScript, puis je suis revenu à un script Apple et je ne me soucie pas vraiment du type de script dont la solution aura besoin.

J'ai réussi à démarrer le processus de sauvegarde avec ce petit extrait de code.

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

Ce que j'essaie de faire maintenant, c'est d'exécuter une commande rsync une fois cette sauvegarde terminée. Existe-t-il un moyen propre dans AppleScript de vérifier si le processus de sauvegarde est terminé? Ou existe-t-il un bon "crochet" que vous pouvez utiliser dans bash pour vérifier s'il est terminé?

Whitneyz
la source
Je demanderais pourquoi ne pas simplement rsync l'original - je pose cette question dans la mesure où je comprends que rsync ne comprend pas les répertoires de liens durs afin que vous finissiez par prendre plusieurs copies de chaque fichier.
user151019
Voulez-vous dire qu'à chaque sauvegarde successive qui est effectuée, Time Machine générera une sauvegarde avec des liens durs vers les fichiers d'origine qui ont déjà été sauvegardés? Je pose cette question parce que je ne connais pas très bien Time Machine. Si tel est le cas, alors oui, je copierais l'original. Mais je suis à peu près sûr que rsync a une option qui lui fera ignorer la recréation de liens durs.
whitneyz
1
Oui, c'est ainsi que TM fonctionne - rsync peut comprendre les liens de fichiers durs mais je ne pense pas qu'ils comprennent les liens de répertoires durs qui sont uniques à OSX depuis 10,5
user151019

Réponses:

4

Voici une façon - je sais que c'est loin d'être une solution «appropriée», mais j'imagine que cela fonctionnerait.

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

Ce qu'il fait, c'est rechercher dans la liste des processus le processus backupd-helper, puis filtrer la commande grep elle-même de ne pas apparaître. Si la commande renvoie> 0 résultats, le processus backupd-helper est toujours actif. Sinon, le processus est terminé et vous pouvez donc supposer que c'est fait.

Harv
la source
1
...pgrep backupd-helper
Jason Salaz
1
J'ai trouvé un moyen plus élégant! TIME_MACHINE_PID = $! attendre $ TIME_MACHINE_PID
whitneyz
1
@whitneyz s'il vous plaît pourriez-vous développer TIME_MACHINE_PID=$! wait $TIME_MACHINE_PIDdans une réponse séparée? Je vous remercie.
Graham Perrin
18

tmutil status est la voie Lion maintenant que nous avons un bel outil pour ce genre de requête.

Sur les systèmes d'exploitation plus récents, il existe une commande non documentée tmutil currentphasequi affiche le nom de la phase en cours.

bmike
la source
Oui - tmutuilc'est tellement plein de victoires, il est difficile d'exprimer à quel point il est agréable de jeter un œil à l'état de sauvegarde, aux statistiques et de piloter les choses par programme.
bmike
Fou qu'il ne soit apparemment pas documenté!
zigg
5

Vous pouvez également démarrer la sauvegarde avec tmutil startbackup -b. -bbloque la commande jusqu'à la fin de la sauvegarde.

Lri
la source
3

tmutil status|grep -c "Running = 1"

renvoie «1» lors de l'exécution, «0» dans le cas contraire.

Tadghostal66
la source
3

L'absence de processus liés à la sauvegarde ne garantit pas qu'une sauvegarde Time Machine est terminée

Sur le volume sur lequel Time Machine écrit ses sauvegardes: à côté du /Latest/répertoire……, considérons:

  • le .inProgress/…… paquet.

Si cet ensemble existe, une sauvegarde est incomplète.

Graham Perrin
la source
Notez que même s'il n'y a pas de .inProgressrépertoire, Time Machine peut toujours être occupé à préparer ou à nettoyer après une sauvegarde (par exemple, supprimer les anciennes sauvegardes).
gidds
1

Le travail suivant pour moi ...


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
la source
0

tmutilsn'existe qu'à partir de 10.7. Avant cela, vous pouvez utiliser, comme mentionné, /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helperpour exécuter manuellement Time Machine.

Vous pouvez ensuite utiliser waitpour attendre la fin du processus. Sans arguments, il attendra simplement; si vous fournissez le PID, vous pouvez obtenir sa valeur de retour (état de sortie).

En particulier, wait $!attendra le dernier processus démarré dans ce shell. Cependant, comme Lauri l'a mentionné, cette attente reviendra avant la fin de Time Machine, car backupd-helper se termine avant la fin de la sauvegarde. Je n'ai pas pu trouver de nom de processus indiquant que la sauvegarde n'était pas terminée.

En regardant le contenu de /var/logs/system.log (ou via la console), j'ai remarqué que lorsque la sauvegarde est terminée, la dernière chose qui est faite est d'éjecter l'image disque de Time Machine. Effectivement, j'ai vérifié que (c'est OS X 10.6.8) pendant la sauvegarde il y a un /Volumes/Time Machine Backups. Ainsi, vous pouvez simplement vérifier si le répertoire existe. Quand ce n'est plus le cas, Time Machine est terminé.

Je ne sais pas si cela fonctionnera pour tout le monde puisque j'ai suivi les instructions ici pour sauvegarder sur une machine Windows sur le réseau.

darda
la source