7 votes

Comment empêcher un launchd script de s'exécuter au réveil ?

J'ai un simple launchd script qui joue un son toutes les 30 minutes et il s'exécute à partir de la bibliothèque de l'utilisateur. ~/Library . Il ne s'exécute pas si ma machine est endormie, mais exécute le dernier événement manqué lorsque la machine se réveille. Je pense que c'est le comportement attendu. Ma question est la suivante : comment puis-je empêcher que cela se produise ? Si j'ai manqué l'événement de la demi-heure, je ne veux pas qu'il soit exécuté à l'heure passée de 20 minutes.

Voici le noyau de mon script. Il appelle un script Python. J'ai essayé de mettre un bloc dans le script Python pour vérifier que je suis à quelques minutes de chaque 30 minutes, mais cela ne semble pas fonctionner sur wake. (Est-ce qu'il manque l'horloge système en quelque sorte ?)

<key>ProgramArguments</key>
<array>
    <string>/usr/local/bin/python3</string>
    <string>/Users/pheon/Documents/playsound.py</string>
</array>

<key>StartCalendarInterval</key>
<array>
    <dict>
        <key>Minute</key>
        <integer>0</integer>
    <dict>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</array>

Voici un extrait du code Python qui vérifie le temps avant de jouer le son.

time0 = datetime.datetime.now() if (time0.minute % 30) < 2: subprocess.run(["/Users/pheon/bin/afplay-vol.sh", "1", bell],check=True)

11voto

Douglas Points 10417

Le problème se situe au niveau de launchd et de la façon dont il gère les tâches qui sont manquées pendant le sommeil :

De la launchd.plist page de manuel ( man launchd.plist )

Unlike cron which skips job invocations when the computer is asleep,
launchd will start the job 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.

Il y a donc quelques options à considérer...

  • revenir à cron . Bien que déprécié, cron n'exécutera pas les travaux qui ont été manqués

  • vérifier l'heure de la journée avant de jouer le son (cela peut être fait avec un script "enveloppant" ou dans le script lui-même.

  • écrire une entrée de journal (quelque part). Au lancement de script, analyser le journal. Si un son a été joué dans les 30 dernières minutes, ne le jouez pas à nouveau.

0 votes

Après avoir joué avec launchd, je suis revenu à cron. Il y a eu quelques problèmes pour faire fonctionner cron sur Mohave. J'ai utilisé les conseils d'ici [ stackoverflow.com/questions/32781884/

2voto

Darren Points 21

J'ai eu un problème similaire et je l'ai résolu en utilisant une évaluation conditionnelle du shell :

  <key>ProgramArguments</key>
  <array>
    <string>zsh</string>
    <string>-c</string>
    <string>minute=$(date +"%M");   if [[ $minute = 00 || $minute = 30 ]]; then afplay -v 2 /System/Library/Sounds/Submarine.aiff; fi</string>
  </array>

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X