Pourquoi mon travail launchd s'exécute au démarrage même avec la clé RunAtLoad définie sur false?

10

J'ai un fichier plist launchd que j'utilise pour exécuter un programme à une heure sélectionnée chaque jour. Cela fonctionne, mais il exécute également le programme chaque fois que je démarre l'ordinateur ou que je décharge et recharge le travail à l'aide du programme GUI LaunchControl --- même si la RunAtLoadclé est définie sur false?

Le fichier plist complet est ci-dessous; il est situé dans /Library/LaunchAgents/:

<?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>RunAtLoad</key>
    <false/>
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false/>
    </dict>
    <key>Label</key>
    <string>com.adbot.plist</string>
    <key>LowPriorityIO</key>
    <true/>
    <key>Program</key>
    <string>/Users/wcm1/programming/ricedh/adbot/adbot.py</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.adbot.plist.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.adbot.plist.out</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>10</integer>
            <key>Minute</key>
            <integer>30</integer>
        </dict>
    </array>
</dict>
</plist>

Pensées?

user76493
la source
Il semble que ma KeepAlivedéfinition impliquait RunAtLoad, et même annulait ma tentative de mettre RunAtLoadà faux. Je ne sais pas pourquoi c'est le cas, mais retirer le KeepAlivebloc semble avoir résolu le problème.
user76493

Réponses:

10

Vous avez probablement une interaction entre les touches SuccessfulExitet RunAtLoad. La page de manuel launchd plist mentionne qu'une inversion a lieu si elle RunAtLoadest définie:

Sortie réussie

Si la valeur est true, le travail sera redémarré tant que le programme se termine et avec un état de sortie de zéro.

Si faux, le travail sera redémarré dans la condition inverse. Cette clé implique que "RunAtLoad" est défini sur true, car le travail doit être exécuté au moins une fois avant que nous puissions obtenir un état de sortie.

D'autres ont rencontré des difficultés avec ce comportement, voir launchd ignore RunAtLoad = false .

Graham Miln
la source