Почему мое запускаемое задание запускается при загрузке, даже если для ключа RunAtLoad установлено значение false?

10

У меня есть файл plist launchd, который я использую для запуска программы в выбранное время каждый день. Это работает, но также запускает программу всякий раз, когда я загружаю компьютер или выгружаю и перезагружаю задание, используя программу с графическим интерфейсом LaunchControl - даже если у меня установлен RunAtLoadключ false?

Полный файл plist ниже; он расположен в /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>

Мысли?

user76493
источник
Похоже, что мое KeepAliveопределение подразумевало RunAtLoadи даже отвергало мою попытку установить RunAtLoadзначение false. Не уверен, почему это так, но удаление KeepAliveблока, похоже, решило проблему.
user76493

Ответы:

10

Вы , вероятно , есть взаимодействие между SuccessfulExitи RunAtLoadключами. Страница руководства launchd plist упоминает, что инверсия имеет место, если RunAtLoadона установлена:

SuccessfulExit

Если значение равно true, задание будет перезапущено до тех пор, пока программа завершит работу и будет иметь нулевое состояние выхода.

Если false, задание будет перезапущено в обратном состоянии. Этот ключ подразумевает, что для «RunAtLoad» задано значение true, поскольку задание необходимо запустить хотя бы один раз, прежде чем мы сможем получить статус выхода.

Другие боролись с этим поведением, см. Launchd игнорирует RunAtLoad = false .

Грэм Милн
источник