Je me rends compte que vous venez de partager avec nous un fragment de code et qu'il n'est pas évident de savoir ce que votre démon cherche à faire de plus que d'effectuer une action toutes les quelques secondes. Je vais donc faire quelques hypothèses sur la base de ce que vous avez écrit.
- On dirait que vous utilisez le fichier de verrouillage pour éviter les lancements en double.
- Il semble alors que vous ayez besoin du piège pour nettoyer le fichier de verrouillage utilisé pour mettre en œuvre votre test pour assurer la singularité.
- De plus, il semble que votre deamon fasse une boucle de sommeil pour se réveiller périodiquement et effectuer une action. (Juste dormir plus, dans votre exemple.)
Ce sont tous des problèmes que launchd est censé résoudre de manière plus efficace sous Darwin (et donc sous OS X).
Pour ce qui est de la ou des questions concernant le déchargement et le SIGTERM, plus précisément, lorsque vous unload
votre launchdeamon reçoit un SIGKILL au lieu d'un SIGTERM. Si vous souhaitez simplement arrêter le travail ou lui envoyer un SIGTERM, utilisez alors stop
au lieu de unload
.
Si vous voulez qu'un SIGTERM soit envoyé sur unload
vous devrez peut-être définir EnableTransactions
. De même, si vous avez des tâches de nettoyage et que vous voulez que votre deamon reçoive des signaux pour le nettoyage et SIGTERM, vous devez configurer EnableTransactions
comme partie du plist launchd pour votre script. <key>EnableTransactions</key><true/>
. Ceci est décrit dans les documents à l'adresse https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
Mais les trois mécanismes ci-dessus sont inutiles étant donné que le lancement...
Sous Darwin / OS X utilisant des démons de lancement, la méthode appropriée pour mettre en œuvre un démon de boucle de sommeil est d'utiliser StartInterval
pour fonctionner sur un intervalle ou StartCalendarInterval
pour exécuter la base à des moments précis. Utilisation de StartCalendarInterval
donne en outre l'avantage que lorsque le système est endormi, il exécutera un intervalle de temps manqué au lieu de devoir attendre le prochain intervalle, et c'est généralement ce que vous voulez dans ces situations. Si vous avez un travail que vous voulez juste rester invoqué, pensez aussi à utiliser KeepAlive
dans le cadre de la plist.
Il semble donc, d'après l'exemple de code que vous avez fourni, que vous voulez simplement exécuter quelque chose toutes les 86400 secondes. Si c'est le cas, launchd a un mécanisme pour le faire que vous devriez utiliser à la place et qui évite le besoin de votre fichier de verrouillage et de votre piège car launchd est conçu pour gérer tout cela pour vous automatiquement. Ce mécanisme est StartInterval
et lorsqu'il est défini, il lancera votre deamon toutes les N secondes. Launchd s'assure également qu'il n'a pas lancé plusieurs copies de votre démon.
Ce mécanisme est décrit dans la documentation de launchd à l'adresse suivante https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html où il est dit :
StartInterval <integer>
This optional key causes the job to be started every N seconds. If the system is
asleep, the job will be started the next time the computer wakes up. If multiple
intervals transpire before the computer is woken, those events will be coalesced
into one event upon wake from sleep.
Donc ton script darwinisé ~/Downloads/Example.sh
regarderait quelque chose de très simple maintenant comme ça :
#!/bin/sh
echo $(date +%R)' Running…' # or whatever it is you wanted to do on the interval
Et votre plist ressemblerait à quelque chose comme ça :
<?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.example</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>~/Downloads/Example.sh</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>StartInterval</key>
<integer>86400</integer>
<key>StandardOutPath</key>
<string>/mypathtolog/myjob.log</string>
<key>StandardErrorPath</key>
<string>/mypathtolog/myjob.log</string>
</dict>
</plist>
Notez que j'ai également ajusté cela pour définir les fichiers de journalisation ici d'une manière semblable à Darwin/launchd plutôt que dans le script lui-même. (Vous pourriez bien sûr les supprimer et les gérer dans votre script mais ce n'est pas nécessaire étant donné launchd).
Je note que vous pourriez également mettre en œuvre cette méthode en utilisant Program
comme ça :
<key>Program</key>
<string>sh</string>
<key>ProgramArguments</key>
<array>
<string>~/Downloads/Example.sh</string>
</array>
Vous pouvez également trouver http://launchd.info une référence utile ainsi que les docs d'Apple pour le fonctionnement de launchd à https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html
Des informations sur les démons exécutés périodiquement sont disponibles à l'adresse suivante https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html#//apple_ref/doc/uid/10000172i-CH1-SW2
1 votes
Ce comportement se poursuit-il si vous supprimez 'sh' et appelez directement le script ? Je suppose que le script a son drapeau exécutable activé.
1 votes
Au lieu de 'launchd unload', avez-vous essayé 'launchctl stop ~/Downloads/Example.plist' ?