Comment utiliser Launchd pour programmer des scripts d’exécution sur Mac

Comment utiliser Launchd pour programmer des scripts d’exécution sur Mac

L’automatisation des tâches en planifiant des scripts est une fonctionnalité puissante sur laquelle de nombreux administrateurs s’appuient au quotidien. Les utilisateurs réguliers de Mac peuvent également exploiter cette puissance à l’aide de launchd, l’outil préféré d’Apple pour l’automatisation et la gestion des tâches sur macOS. De la planification de tâches simples comme la désactivation du Wi-Fi à une heure précise à l’exécution de sauvegardes système complexes, launchd sur Mac peut vous aider à automatiser vos flux de travail, à gagner du temps et à vous assurer que votre système fonctionne exactement comme vous l’aimez.

Qu’est-ce qui est lancé ?

Tout comme un orchestre a besoin d’un chef d’orchestre pour guider et harmoniser les divers instruments, macOS Ventura , avec sa myriade de processus et de services, s’appuie sur launchd pour s’assurer que tout joue en parfait concert. En tant que premier processus lancé par le noyau macOS lorsque vous démarrez votre ordinateur, launchd occupe le devant de la scène, orchestrant tous les processus, services et applications ultérieurs, un peu comme un chef d’orchestre signalant le début d’une symphonie avec la première levée de bâton.

Au-delà de son rôle dans l’orchestration du système, launchd peut être utilisé pour planifier des scripts, une série de commandes écrites pour effectuer une tâche spécifique. Cela se fait à l’aide de la launchctlcommande, qui sert d’interface aux utilisateurs pour communiquer et diriger le conducteur lancé.

Démons et agents

launchd est parfois appelé démon, un programme informatique qui s’exécute en arrière-plan et n’est généralement pas conçu pour être contrôlé directement par un utilisateur. En ce qui concerne les démons, launchd est spécial, car c’est le maestro de tous les autres démons macOS, et il peut décider quand ils démarrent et s’arrêtent. Ces démons subordonnés s’exécutent sous l’utilisateur root, ils peuvent donc faire à peu près n’importe quoi.

Graphique Wiki Démon Maxwell
Source de l’image : Wikipédia

Cependant, en tant qu’utilisateur intéressé par la planification des tâches, l’exécution de scripts sous l’utilisateur root n’est pas toujours souhaitable ou nécessaire. C’est là que les agents entrent en jeu. Les agents s’exécutent au nom d’un utilisateur connecté, offrant un environnement plus restreint et garantissant que les scripts ou les tâches sont exécutés avec les autorisations et les préférences de cet utilisateur spécifique. Par exemple, si vous souhaitez exécuter un script qui modifie les paramètres ou accède aux fichiers de votre compte, vous utiliserez un agent.

Rédaction de scripts

Pour exécuter des agents ou des démons via launchd, vous devrez écrire des scripts. Le langage de script le plus courant est bash. Si vous souhaitez en savoir plus sur les scripts bash, vous pouvez consulter notre guide du débutant sur les scripts bash .

launchd-code-scriptto

Vos scripts launchd peuvent résider à deux emplacements différents, selon qu’ils sont destinés à être exécutés en tant qu’agents ou démons :

  • Pour les scripts destinés à être des agents, agissant au nom de l’utilisateur connecté, ils doivent être stockés dans « ~/Library/LaunchAgents ».
  • À l’inverse, les scripts destinés à fonctionner comme des démons, fonctionnant à l’échelle du système quel que soit l’utilisateur connecté, appartiennent à « /Library/LaunchDaemons ».

N’oubliez pas que les agents ne disposent pas d’autorisations root, ils ne peuvent donc pas effectuer de tâches nécessitant un accès approfondi au système. Les démons, quant à eux, s’exécutent avec des autorisations root et peuvent gérer des tâches qui affectent l’ensemble du système.

Les descriptions d’emploi

launchd-scripts-job-description

Les scripts dans launchd sont déclenchés par des définitions de travail, qui sont. plist fichiers stockés dans des répertoires spécifiques. Ces fichiers XML donnent un nom au travail, spécifient le script qui doit être lancé et indiquent quand le script doit être exécuté. Une fois que vous avez écrit votre script, vous écrivez et chargez une définition de travail qui lance le script au moment approprié. Une définition de travail ressemble à ceci :

<?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>local.restart</string>
<key>Program</key>
<string>/Users/user/Scripts/restart.sh</string>
<key>RunAtLoad</key>
<true/>
</dict></plist>

Modifiez-le si nécessaire, puis placez-le dans un fichier texte avec l’extension . plist avant de la déposer dans le bon répertoire (voir ci-dessus).

Il y a quelques éléments clés dans la description de poste :

  • Libellé : le nom du travail dans launchd. Doit être unique pour chaque travail. Ceux-ci sont écrits en notation de domaine inverse, et « local » est un excellent domaine pour les agents privés.
  • Programme : le chemin complet du script lancé par cette description de poste.
  • RunAtLoad : décrit quand le script doit être exécuté. Il y a quelques options différentes ici :
    • RunAtLoad : s’exécute dès que la définition de la tâche est chargée. Fonctionne une seule fois par charge.
    • StartInterval : démarre la tâche toutes les n secondes. Cet exemple exécutera la tâche toutes les 7200 secondes ou toutes les 2 heures.<key>StartInterval</key> <integer>7200</integer>
    • StartCalendarInterval : exécute le travail à une heure et une date spécifiques. Le code ci-dessous exécutera le travail tous les jours à 9 heures.<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>

Chargement des tâches dans launchctl

launchd-scripts-launchctl-liste

Une fois que vous avez créé vos scripts et enregistré votre agent au bon endroit, vous devrez le charger dans launchctl. Cela se produira automatiquement lors des connexions à l’avenir.

Pour voir ce qui s’exécute actuellement dans laucnhctl, vous pouvez utiliser launchctl listdans le terminal. Cette liste géante peut être préparée pour votre script en l’étiquetant avec quelque chose comme ceci :

launchctl list | grep local.restart

Pour charger un script, ouvrez Terminal et utilisez la commande suivante :

launchctl load ~/Library/LaunchAgents/local.restart.plist

launchd-scripts-launchctl-load

Pour supprimer le script de la file d’attente launchctl, utilisez la unloadcommande :

launchctl unload ~/Library/LaunchAgents/local.restart.plist

launchd-scripts-lancerctl-décharger

Le chargement d’un travail le place dans la file d’attente launchd et le travail s’exécutera à l’heure spécifiée dans ses conditions de lancement. Si vous voulez exécuter un script immédiatement quoi qu’il arrive, vous devez utiliser la commande « start »:

launchctl start local.restart

Cette commande prend l’étiquette du travail et ne fonctionnera que si le travail a déjà été chargé dans launchctl.

Questions fréquemment posées

Comment puis-je vérifier si launchd a démarré un script ?

Vous pouvez utiliser la launchctl listcommande dans le terminal. Cela affichera tous les travaux chargés. Pour trouver un script ou un travail spécifique, utilisez grep, par exemple, launchctl list | grep your_script_name.

Que se passe-t-il si launchd utilise trop de ressources système ?

Si launchd consomme trop de ressources, cela est généralement dû à un script ou à un travail qui se comporte mal. Vous devriez passer en revue les scripts que vous avez ajoutés récemment et les décharger à l’aide de launchctl unload /path/to/job.plist.

Quelle est la différence entre cron et launchd ?

cron et launchd sont tous deux des services de planification, mais ils fonctionnent différemment. cron est un ancien planificateur de travaux basé sur Unix qui exécute des travaux à des heures ou à des intervalles fixes définis dans un fichier crontab. launchd est le nouveau système d’Apple pour macOS qui peut démarrer des tâches en fonction de divers déclencheurs, et pas seulement du temps.

Puis-je utiliser d’autres langages de script que bash avec launchd ?

launchd peut exécuter n’importe quel script exécutable depuis le terminal. Cela inclut les scripts écrits en Python, Perl, Ruby et d’autres langages.

Crédit image : Pexels . Toutes les captures d’écran de David Morelo.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *