Warum wird mein Startjob beim Booten ausgeführt, obwohl der RunAtLoad-Schlüssel auf false gesetzt ist?

10

Ich habe eine Launchd-Plist-Datei, mit der ich jeden Tag zu einer ausgewählten Zeit ein Programm ausführe. Es funktioniert, aber es führt das Programm auch aus, wenn ich den Computer starte oder den Job mit dem GUI-Programm LaunchControl entlade und neu lade - obwohl ich den RunAtLoadSchlüssel auf false gesetzt habe?

Die vollständige Plist-Datei finden Sie weiter unten. es befindet sich in /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>

Gedanken?

user76493
quelle
Es scheint, dass meine KeepAliveDefinition implizierte RunAtLoadund sogar meinen Versuch, RunAtLoadauf falsch zu setzen, außer Kraft setzte. Ich KeepAlivebin mir nicht sicher, warum dies der Fall ist, aber das Herausnehmen des Blocks scheint das Problem behoben zu haben.
user76493

Antworten:

10

Sie haben wahrscheinlich eine Interaktion zwischen den Tasten SuccessfulExitund RunAtLoad. Auf der Handbuchseite von launchd plist wird erwähnt, dass eine Inversion stattfindet, wenn FolgendesRunAtLoad festgelegt ist:

Erfolgreicher Ausgang

Wenn true, wird der Job neu gestartet, solange das Programm beendet wird und der Beendigungsstatus Null ist.

Bei false wird der Job im umgekehrten Zustand neu gestartet. Dieser Schlüssel impliziert, dass "RunAtLoad" auf "true" gesetzt ist, da der Job mindestens einmal ausgeführt werden muss, bevor wir einen Exit-Status erhalten können.

Andere haben mit diesem Verhalten zu kämpfen, siehe launchd ignoriert RunAtLoad = false .

Graham Miln
quelle