launchd
peut faire ce dont vous avez besoin. Tant que votre système n'est pas endormi toute la journée, et qu'il est programmé à l'aide de la fonction StartCalendarInterval
(voir ci-dessous), launchd
exécutera votre script une fois par jour. Voici ce que je veux dire :
- Si vous programmez l'exécution de votre script à (par exemple) 12h00, ET que votre mac est réveillé à 12h00, alors votre script s'exécutera à 12h00.
- Si vous programmez l'exécution de votre script à (par exemple) 12h00, MAIS que votre mac est endormi à 12h00, alors votre script s'exécutera dès que votre mac se réveillera.
IMHO, launchd
a un avantage car il fait partie de MacOS. Le seul outil tiers que vous pourriez vouloir utiliser avec lui est le suivant LaunchControl
(au lieu de la version native launchctl
). LaunchControl
est une application basée sur l'interface graphique utilisée uniquement pour vous aider à créer/modifier votre site web. .plist
et peut aider à la gestion et au dépannage si cela s'avère nécessaire. Le site .plist
contient les instructions qui seront utilisées par launchd
pour démarrer votre programme, et peut être très simple. Et bien sûr, vous pouvez éviter complètement les logiciels tiers en créant simplement l'application .plist
"manuellement" avec un éditeur de texte.
Comme mentionné ci-dessus, le clé de configuration que vous devez utiliser dans votre .plist
pour planifier l'heure d'exécution de votre travail/script est StartCalendarInterval
. Selon man launchd.plist
:
Contrairement à cron qui ignore les invocations de tâches lorsque l'ordinateur est endormi, launchd lancera la tâche au prochain réveil de l'ordinateur. Si plusieurs intervalles s'écoulent avant le réveil de l'ordinateur, ces événements seront regroupés en un seul lors de la sortie du sommeil.
Exemple
Voici un exemple de la façon d'utiliser launchd
pour créer un User Agent
. Le champ d'application d'un User Agent
est qu'il ne fonctionne que pour un seul utilisateur. Notez qu'il est également possible de créer Global Agent
ou un Global Daemon
qui fonctionne pour plusieurs/tous les utilisateurs, mais nous laisserons cela pour un autre jour. :
-
Créez un script dans votre répertoire personnel ( ~/
) pour afficher la date et l'heure à chaque fois qu'il est exécuté :
!/bin/bash
CURRENTDATE=date +"%c"
echo Current Date and Time is: ${CURRENTDATE}
Nommez le script. echodatetime.sh
& le rendre exécutable :
$ chmod 755 ~/echodatetime.sh
- Créez un fichier .plist dans ~/Bibliothèque/LaunchAgents/sdm.simple.exampleofPLIST.plist :
EDIT : NOTE ! NE PAS UTILISER ~/
comme raccourci pour le répertoire personnel de l'utilisateur ! Vous devez utiliser un chemin complet, sinon cela ne fonctionnera pas.
<?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>Disabled</key>
<false/>
<key>Label</key>
<string>seamus.simple.example</string>
<key>ProgramArguments</key>
<array>
<string>/Users/seamus/echodatetime.sh</string>
</array>
<key>StandardErrorPath</key>
<string>/Users/seamus/echodatetime.error.txt</string>
<key>StandardOutPath</key>
<string>/Users/seamus/echodatetime.log.txt</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>25</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>26</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>27</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>28</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>29</integer>
</dict>
</array>
</dict>
</plist>
Ce fichier .plist va provoquer ~/echodatetime.sh
à exécuter chaque jour aux heures suivantes :
01:25
01:26
01:27
01:28
01:29
Vous pouvez modifier le integer
valeurs dans le tableau pour la clé StartCalendarInterval
pour obtenir le timing qui vous convient. Il s'agit juste d'un exemple que j'ai utilisé pour tester.
L'exemple ci-dessus montre une "rafale" de cinq (5) passages à une minute d'intervalle. Cela a été fait pour montrer la syntaxe quelque peu étrange requise pour une telle programmation. La programmation d'un seul événement à exécuter une fois par jour, tous les jours, à midi, peut être réalisée en substituant la syntaxe plus simple suivante StartCalendarInterval
indiquée ci-dessous dans le .plist
montré ci-dessus :
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>12</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</array>
-
load
votre travail et vérifiez qu'il est en cours d'exécution :
$ launchctl load ~/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist
$ launchctl list | grep seamus
-
Surveillez le fichier de sortie déclaré dans le fichier StandardOutPath
clé :
$ tail -f ~/echodatetime.log.txt
Après load
ing le fichier .plist, vous verrez l'affichage de la date et de l'heure aux moments indiqués dans le fichier .plist. StartCalendarInterval
clé : à intervalles d'une minute commençant à 01:25 et se terminant à 01:29 si vous utilisez mon fichier .plist.
Miscellany
-
En .plist
Les fichiers ci-dessus ont été testés et ont fonctionné avec succès sur mon macbook pro sous Mojave (ver 10.14.6). J'ai également vérifié le comportement de launchd
lorsqu'un calendrier d'événements se produit pendant sleep
: La tâche s'est exécutée immédiatement après le "réveil" du mac, et a enregistré l'heure à laquelle il s'est réveillé (c'est-à-dire pas l'heure prévue).
-
Oui, la syntaxe .plist est obscure ! Pensez à utiliser LaunchControl
au lieu de pirater manuellement ces fichiers.
-
Une astuce potentiellement utile : vous pouvez vérifier la syntaxe de votre fichier .plist comme suit :
$ plutil -lint /Users/seamus/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist
/Users/seamus/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist: OK
-
Quand vous aurez fini avec cet exemple, vous pourrez remove
le travail de launchd
puis supprimez ou déplacez le fichier de votre dossier. ~/Library/LaunchAgents
. Sinon, votre travail sera relancé par launchd
la prochaine fois que vous vous connecterez :
$ launchctl remove seamus.simple.example
$ mv ~/LaunchAgents/sdm.simple.exampleofPLIST.plist ~/archive
Alternativement, laissez le fichier où il est, et définissez l'attribut Disabled
pour true
dans le .plist :
<key>Disabled</key>
<true/>