Admin/Dev

03
Oct.
2019

Astuce macOS : Créer une sauvegarde automatique avec rsync et launchctl - Partie 3

Publié par sky

Après une petite pause estivale, nous voici de retour pour la troisième et dernière partie de ce guide vous permettant de mettre en place une sauvegarde parallèle à TimeMachine.

Cela fait déjà deux articles que je vous parle de launchd ou de launchctl, tout en restant très évasif sur le sujet. Ce troisième article est donc là pour éclaircir ce point, mais aussi pour finaliser notre système de sauvegarde.

 

Qu'est ce que launchd et launchctl ?

Launchd est le service de gestion des applications de macOS. Introduit avec 10.4 Tiger, c'est lui qui va régir et superviser le lancement ou l'arrêt de chacune des applications que l'on va lancer sur macOS. Plus important, c'est aussi lui qui va gérer tous les démons et agents, qui, invisibles, tournent aussi sur notre Mac. Ils sont vraiment très nombreux, vous devriez même être surpris de voir combien, il y en a d'activés à tout moment.

Afin de vous donner l'importance de launchd sur nos Mac, il faut savoir que c'est le tout premier processus qui est lancé par le système. C'est ensuite lui qui à la charge de gérer tous les suivants.

Si vous regardez l'ensemble des processus actifs (pas uniquement les démons et agents), avec la commande

ps -acx

vous verrez que launchd est le premier de la liste, et qu'il possède l'identifiant 1.

PID TTY           TIME CMD
   1 ??         3:34.68 launchd

Launchd ne peut pas être contrôlé directement. Il faut passer par une interface, qui s'occupera ensuite d'envoyer les informations à launchd de manière sécurisée. Cette interface est une application en ligne de commande appelée launchctl.

C'est avec cette commande que l'on va pouvoir lancer notre propre programme de backup.

En attendant, grâce à launchctl, vous pouvez voir la liste des éléments (agents et démons), attaché à votre session utilisateur :

launchctl list

ou au niveau système, en disposant des droits administrateurs

sudo launchctl list

 

Qu'est ce qu'un démon ? et un agent ?

Et bien oui, avant de se lancer, il est tout de même intéressant de savoir ce que l'on va faire.

Les démons et agents sont donc des programmes qui fonctionnent en tâche de fond, le plus discrètement possible, afin de vous offrir des services des plus simples aux plus compliqués.

Si vous avez regardé la liste des programmes donnée par launchctl, avec les commandes vues au dessus, vous avez peut être trouvé des éléments tels que

226    0    com.apple.usbd

Ce démon va notifier le reste du système lors du branchement et du débranchement d'un appareil USB sur votre mac.

Il y a aussi

86    0    com.apple.timed

qui va gérer l'horloge de votre Mac.

Un petit dernier pour la route ? Regardons

57    0    com.apple.powerd

qui va gérer l'alimentation du Mac, et les éventuelles batteries branchées dessus, qu'elles soient internes comme sur les MacBook ou via un onduleur externe.

Les programmes qui sont lancés disposent d'un PID (la première colonne), si c'est un "-" qui est indiqué, le processus est en sommeil et sera lancé à la demande.

Au total, il y en a plus de 500 sur mon Mac, et et vous devriez en avoir tout autant sur le votre. La plupart sont signés par Apple comme nous pouvons le voir avec les 3 exemples.

Mais d'autres logiciels peuvent ajouter leurs propres démons et agents. Ainsi, sur mon Mac Pro dans lequel il y a une carte graphique Nvidia, il y a plusieurs lignes relatives aux drivers graphiques et à CUDA.

-    0    com.nvidia.cudad
665    0    com.nvidia.nvroothelper
-    0    com.nvidia.cuda.launcher

Si vous aviez suivi l'article pour installer minidlna, vous devriez trouver

19070    0    homebrew.mxcl.minidlna

D'autres sont intégrés par Apple, mais disposent d'une autre signature, c'est le cas par exemple du service SSH, qui permet les connexions à distance. On le retrouve avec cette ligne

-    0    com.openssh.sshd

Bizarrement, ce programme ne semble pas tourner, puisque le PID est "-". Pourtant, je suis bien connecté en SSH à ce Mac lors de la réalisation de ces tests. C'est tout simplement parce que chaque connexion initiée dispose ensuite de son propre identifiant.

80499    0    com.openssh.sshd.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

 

Qu'est ce qui différencie un démon d'un agent ?

Si tous les deux sont gérés par launchd, ils ont cependant une définition très différente.

Un démon est un programme autonome qui ne doit pas interférer avec les utilisateurs. Il s'agit, par exemple, un serveur web, un serveur de base de données, ou encore un serveur de fichier. Ils vont fonctionner dès le lancement de la machine, même si aucun utilisateur n'est connecté.

Certes, un utilisateur connecté pourrait se faire un appel à ces services. Cependant les interactions ne peuvent pas aller dans l'autres sens, un démon de doit pas dépendre de l'utilisateur connecté, ou même d'un utilisateur déconnecté.

Un agent, au contraire, est bien souvent un service dédié à l'utilisateur, et dont le but est de l'aider dans un but bien précis. Il s'agit, par exemple, des nombreux "Helpers" qui servent à vérifier la présence de mises à jour pour nos applications favorites même si elles ne sont pas lancées. Les nombreuses notifications de Microsoft Updater viennent, par exemple, d'un agent développé par Microsoft, et installé sur votre Mac en même temps que la suite Office ou le logiciel Skype.

Si pour l'utilisateur lambda, la différence est plutôt minime, pour la machine et les utilisateurs avancés, c'est une différence très importante. En effet, si un Mac est utilisé en tant que serveur web, il est nécessaire que l'ensemble des applications dédiées se lance au démarrage de la machine, et qu'elles ne fonctionnent pas uniquement lorsqu'il est connecté.

 

Comment sont définis ces agents et démons ?

La description de chaque agent et chaque démon se fait via un petit fichier de description. Ce fichier, au format XML, va donner les informations dont a besoin le système, et en particulier launchctl, pour gérer ces programmes.

Ces fichiers sont localisés dans les dossiers Bibliothèque (ou Library en anglais) de notre système.

Le niveau le plus proche de nous est notre dossier utilisateur. Comme nous l'avons vu précédemment, à ce niveau là, il ne peut pas y avoir de démons, seulement des agents.

Nous avons donc un seul dossier qui est

~/Library/LaunchAgents

Si l'on remonte d'un niveau, les agents et démons peuvent être placés dans le dossier Bibliothèque partagé entre tous les utilisateurs. Chaque type dispose d'un dossier

/Library/LaunchAgents
/Library/LaunchDaemons

Enfin, les programmes internes à macOS, auxquels il est préférable de ne pas toucher, sont placés dans le dossier Système.

/System/Library/LaunchAgents
/System/Library/LaunchDaemons

 

Quel rapport avec notre besoin original qui est la sauvegarde de quelques dossiers ?

Le but de notre sauvegarde est de fonctionner seule, sans que l'on ait besoin de s'en occuper. Nous allons donc créer un petit démon, qui se lancera périodiquement sans intervention humaine.

Ce démon sera assez simple, nous devons indiquer :

  • Un nom, qui permettra de lancer mais aussi d'interrompre le processus, si nécessaire,
  • L'action qu'il doit faire, ici ce sera de lancer le script écrit dans la partie 2,
  • La fréquence d'exécution.

Nous devons donc écrire le XML correspondant à ces besoins, et évidemment, compréhensible par launchd.

La base du XML est la suivante

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>

    </dict>
</plist>

A l'intérieur de la balise dict (pour dictionnary), j'ajoute les éléments dont on a besoin, sous la forme clé/valeur. Une première balise key donnera la clé, elle est suivi par une seconde balise qui sera la valeur attribuée.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>org.skymac.backup</string>
        <key>Program</key>
        <string>/Users/sky/Scripts/Backup.sh</string>
        <key>StartInterval</key>
        <integer>14400</integer>
    </dict>
</plist>

Le nom est indiqué sous la clé Label, et doit être une chaîne de caractère (string en anglais). Par convention, le nom utilise la notation du domaine inversé. Si vous ne disposez pas d'un domaine à vous, vous pouvez en imaginer un ou utiliser le nom de votre machine. Par exemple, mon Mac Pro sur le réseau local s'appelle

MacPro.local

Cette valeur est indiquée dans Préférences système, section Partage. Le Label deviendrait donc

local.MacPro.backup

Il faut juste éviter d'utiliser celui d'un programme qui existe déjà.

Pour définir le programme à lancer, ici notre script, il faut renseigner la clé Program, et doit être aussi une chaîne de caractère. Plus précisément, il s'agit du chemin complet, depuis la racine du disque dur, vers le fichier du script.

Enfin, pour définir la fréquence de lancement du script, j'utilise la clé StartInterval, qui attend une valeur sous la forme d'un numérique entier, représentant le nombre de seconde entre 2 exécutions. La valeur représente 14400 secondes soit 4 heures.

J'enregistre maintenant le fichier, dans le dossier /Library/LaunchDaemons en utilisant la même nomenclature de domaine inversé. La même utilisé pour le Label, en ajoutant l'extension .plist.

org.skymac.backup.plist

Votre mot de passe administrateur sera demandé pour placer le fichier dans le dossier bibliothèque partagée.

 

Que faut il faire pour activer le démon ?

Actuellement mon démon se trouve bien dans le dossier, mais n'est pas encore fonctionnel.

Pour l'activer, je peux simplement redémarrer le Mac. macOS, au démarrage, prendra l'ensemble des fichiers des différents dossiers énoncés au dessus.

Mais pour éviter un redémarrage inutile, et en plus, obtenir les éventuelles erreurs, je préfère le l'activer manuellement, avec la commande launchctl.

launchctl load /Library/LaunchDaemons/org.skymac.backup.plist

Si vous n'avez aucune réponse à cette commande, c'est bon signe, le démon est chargé, et sera exécuté tel qu'indiqué dans son fichier de description. Sinon, vous obtiendrez une erreur.

De la même manière, si vous souhaitez retirer un démon (ou un agent), il faut utiliser la sous-commande unload.

launchctl unload /Library/LaunchDaemons/org.skymac.backup.plist

Si vous faites une modification de votre fichier de description, il faudra décharger puis recharger votre démon.

 

En savoir plus sur launchd et launchctl

Evidemment, avec ce tutoriel, nous n'avons fait qu'effleurer les possibilités de launchd et launchctl, comme nous l'avions fait avec rsync. Rien que pour l'écriture des fichiers de configuration, il existe une multitude de clés qui offre un large éventail de possibilités.

Par exemple, parmi les éléments que j'utilise le plus, il est possible d'ajouter des paramètres pour notre programme. Le déclenchement de l'exécution du script peut être défini autrement, soit au démarrage, soit au lancement de la session (en le passant en tant qu'agent), ou encore à des dates et heures bien précises.

Quant à launchctl, il est dispose d'un certain nombre d'actions, que vous pouvez découvrir dans le man de la commande

man launchctl

Un nouvel article viendra certainement détailler tout cela dans le futur...

 
Sommaire de la série
 
 
Commentaires
Commentaire de Jean le 17 Octobre 2019 à 20:05

Bonsoir,
A la lecture de ce texte, je pressens que vous êtes un expert Mac OS !
Je me permets donc de vous solliciter car je suis équipé d'un iMac fabriqué fin 2009 dont je suis entièrement satisfait sauf que depuis une dizaine de jours il ne boote plus, sauf en mode sans échec (c'est-à-dire sur 3 pattes) !!!
Je tourne sous High Sierra (10.13.6).
J'ai tout essayé : diagnostic (a priori, il n'y a pas de panne), re-installation de MacOS, formatage du disque dur, restauration depuis Time Machine, ... J'ai le sentiment que mon problème est plutôt matériel que logiciel car lorsqu'il boote, il s'arrête toujours au même endroit (à peu près à la moitié de la barre d'avancement).
Pourrait-il s'agir de la carte graphique ? ou de sa mémoire associée ?
Je vous remercie d'avance si vous pouviez m'indiquer une piste de recherche.
Cordialement.
Jean

 
Commentaire de sky le 17 Octobre 2019 à 20:52

Bonsoir Jean,
Comme cela, cela va être difficile de trouver la solution. C'est toujours plus simple d'avoir la machine sous la main pour faire les tests de base et écarter toutes les mauvaises pistes au fur et à mesure.

Mais tel que vous en parlez, je miserai sur le disque dur. S'agit il du disque dur d'origine ?
Arrivez vous à démarrer sur une partition Recovery ou un disque d'installation de macOS ?
Avez vous un disque externe pour tester une installation sur un autre disque que l'interne ?

 

 

Poster un commentaire
En postant sur skymac.org, je m'engage à être courtois et à ce que mon message soit pertinent avec le sujet de l'article.
En outre, j'accepte, sans condition, que mon message soit refusé et supprimé si ces règles ne sont pas appliquées.
Ouvrir le panneau de gestion des cookies
Fermer le panneau
Ce site utilise des cookies pour assurer son bon fonctionnement. Il utilise aussi des cookies issues de services tiers permettant de proposer des fonctionnalités avancées. À tout moment, vous pouvez choisir quels services vous souhaitez activer ou refuser, afin de retirer votre consentement quant à l'utilisation des cookies.
 
Personnalisation des services
Vous êtes libre de choisir quels services vous souhaitez activer. En autorisant ces services tiers, vous acceptez le dépôt et la lecture de cookies et l'utilisation de technologies de suivi nécessaires à leur bon fonctionnement. En retirant votre consentement pour certains de ces services, certaines fonctionnalités du site peuvent ne plus fonctionner.
Navigation du site  En savoir plus
Le site écrit un cookie de session permettant son bon fonctionnement et aidant à la navigation. Il ne peut être désactivé.
Utilisation : 1 cookie, enregistre l'identifiant de la session.
Durée de vie : Le cookie est présent pendant toute la session sur le site. Il devient obsolète après 24 minutes d'inactivité.
Obligatoire
Popup Média
Afficher des vidéos depuis Yoube ou Dailymotion.
 
Tout accepter Tout refuser Gérer