Por que meu trabalho launchd está sendo executado na inicialização, mesmo com a chave RunAtLoad definida como false?

10

Eu tenho um arquivo launchd plist que eu uso para executar um programa em um horário selecionado todos os dias. Funciona, mas também executa o programa sempre que eu inicializo o computador ou descarrego e recarrego o trabalho usando o programa da GUI LaunchControl --- mesmo que eu tenha a RunAtLoadchave definida como false?

O arquivo plist completo está abaixo; está localizado em /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>

Pensamentos?

user76493
fonte
Parece que minha KeepAlivedefinição estava implicando RunAtLoade até substituindo minha tentativa de definir RunAtLoadcomo false. Não sei por que esse é o caso, mas remover o KeepAlivebloco parece ter corrigido o problema.
user76493

Respostas:

10

Você provavelmente tem uma interação entre as teclas SuccessfulExite RunAtLoad. A página de manual do launchd plist menciona que ocorre uma inversão se RunAtLoadestiver definido:

Saída bem sucedida

Se verdadeiro, o trabalho será reiniciado enquanto o programa sair e com um status de saída igual a zero.

Se falso, o trabalho será reiniciado na condição inversa. Essa chave implica que "RunAtLoad" está definido como true, pois o trabalho precisa ser executado pelo menos uma vez antes que possamos obter um status de saída.

Outros lutaram com esse comportamento. Consulte launchd ignora RunAtLoad = false .

Graham Miln
fonte