1 votes

L'agent de lancement lance ma tâche toutes les 10 secondes alors que le champ StartInterval est fixé à 60 %.

Je veux exécuter un script toutes les 60 secondes. J'ai créé un fichier .plist comme suit

<?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>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>info.hotoku.launch-sample</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/hotoku/projects/hotoku/launch-sample/run</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/Users/hotoku/projects/hotoku/launch-sample/stderr</string>
    <key>StandardOutPath</key>
    <string>/Users/hotoku/projects/hotoku/launch-sample/stdout</string>
    <key>WorkingDirectory</key>
    <string>/Users/hotoku/projects/hotoku/launch-sample</string>
    <key>StartInterval</key>
    <integer>60</integer>
  </dict>
</plist>

Le contenu du script spécifié est le suivant :

#!/bin/bash

echo [$(date +"%Y-%m-%d %H:%M:%S")] run

C'est-à-dire que le script ne fait que sortir le temps d'exécution dans son stdout (bien sûr, c'est un exemple).

J'ai placé le fichier .plist dans mon ~/Library/LaunchAgent . Attendre plusieurs minutes et vérifier le contenu du StandardOutPath j'ai eu ça.

$ cat /Users/hotoku/projects/hotoku/launch-sample/stdout
[2022-02-01 09:13:55] run
[2022-02-01 09:14:05] run
[2022-02-01 09:14:15] run
[2022-02-01 09:14:25] run
[2022-02-01 09:14:35] run
[2022-02-01 09:14:46] run
[2022-02-01 09:14:56] run
[2022-02-01 09:15:06] run
[2022-02-01 09:15:16] run
[2022-02-01 09:15:26] run

Il semble que mon agent de lancement se lance toutes les 10 secondes alors que la valeur de l'intervalle de démarrage est de 60.

Quelqu'un peut-il résoudre le problème ?

3voto

Gordon Davisson Points 30215

Cela est dû au fait que <key>KeepAlive</key><true/> dans le fichier .plist, ce qui indique à launchd de redémarrer automatiquement le programme si/quand il se termine. launchd n'aime pas redémarrer les choses trop souvent, donc par défaut il va "limiter" les redémarrages à toutes les 10 secondes (ce qui est ce que vous voyez). Vous pouvez soit définir la clé sur <false/> ou supprimez-la entièrement (la valeur par défaut est false).

Si vous souhaitez que le travail soit relancé dans certaines conditions, vous pouvez spécifier un ensemble de conditions dans lesquelles il doit être relancé. Par exemple, pour redémarrer le travail s'il se termine avec un statut d'erreur, vous pouvez utiliser ceci :

<key>KeepAlive</key>
<dict>
    <key>SuccessfulExit</key>
    <false/>
</dict>

(Dans ce cas, <key>SuccessfulExit</key><false/> signifie essentiellement "s'il n'est pas sorti avec succès").

BTW, je sais que script est juste un stub pour tester comment le job est exécuté, mais j'ai remarqué un bug. Depuis que [$(date +"%Y-%m-%d %H:%M:%S")] n'est pas entre guillemets, l'interpréteur de commandes essaiera de le "développer" en une liste de noms de fichiers correspondants. C'est-à-dire, [2022-02-01 09:13:55] recherchera les fichiers nommés "2", "0", etc. et s'il en trouve, il remplacera l'expression entre crochets par les noms correspondants. Donc si vous obtenez un résultat comme celui-ci :

2 run
2 run
2 run
...etc

Cela signifie qu'il existe un fichier nommé "2" dans le répertoire de travail de l'agent (probablement votre répertoire personnel). Vous devez soit le citer deux fois, soit l'inclure dans le champ de saisie de l'agent. date chaîne de format (encore une fois, correctement citée) :

date +"[%Y-%m-%d %H:%M:%S] run"

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