14 votes

Comment déboguer un LaunchAgent utilisateur qui ne semble pas démarrer ou se charger avec launchctl ?

Description du problème

L'exécution de l'utilisateur LaunchAgent suivant n'affiche pas de travail démarré, et le travail n'enregistre pas d'erreur ni ne fait quoi que ce soit de détectable. Les commandes Vault intégrées dans le fichier plist fonctionnent bien lorsqu'elles sont exécutées à partir de la crontab de l'utilisateur ou de la ligne de commande. J'ai exécuté les commandes suivantes en tant qu'utilisateur non-Root :

# returns exit status 3
launchctl start local.localhost.RenewVaultToken.plist
echo $?

# also returns exit status 3
launchctl enable gui/$UID/local.localhost.RenewVaultToken
launchctl start gui/$UID/local.localhost.RenewVaultToken
echo $?

# returns "Load failed: 5: Input/output error"
launchctl load gui/$UID/local.localhost.RenewVaultToken

# no results
launchctl list | fgrep -i vault

Le journal du système ne révèle rien d'identifiable et aucun fichier journal n'est créé. Pour autant que je puisse en juger, le travail ne peut ni ne veut démarrer ou s'exécuter, mais je ne suis pas sûr de savoir comment le déboguer plus efficacement.

Contenu du fichier LaunchAgent

Le fichier suivant est stocké dans ~/Library/LaunchAgents avec le nom de fichier local.localhost.RenewVaultToken.plist . Le fichier est mis en mode 0600 .

<?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">

<!-- ~/Library/LaunchAgents/local.localhost.RenewVaultToken.plist -->
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.localhost.RenewVaultToken</string>

        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/vault</string>
            <string>token</string>
            <string>renew</string>
            <string>-increment=12h</string>
            <string>-address="https://vault.example.com"</string>
        </array>

        <key>StartInterval</key>
        <integer>14400</integer>

        <key>RunAtLoad</key>
        <true/>

        <key>Debug</key>
        <true/>

        <key>StandardOutPath</key>
        <string>/Users/foo/stdout.log</string>

        <key>StandardErrorPath</key>
        <string>/Users/foo/stderr.log</string>
    </dict>
</plist>

15voto

Michael Ratanapintha Points 11957

Dans mon cas, j'avais ceci (trompeur) Load failed: 5: Input/output error parce que le service était déjà chargé. A launchctl unload ~/Library/LaunchAgents/... a résolu ce problème.

3voto

d5ve Points 119

J'ai également rencontré ce problème et je pense avoir trouvé une solution.

J'ai lu les launchctl et a vu que load y start sont désormais considérées comme des sous-commandes héritées du passé.

Les sous-commandes de l'implémentation précédente de launchd sont généralement disponibles, bien que certaines puissent ne pas être implémentées.

Je pense que l'ancien comportement peut être obtenu par les deux commandes suivantes :

# Enable this plist
launchctl enable service-target

# Run this plist now
launchctl kickstart service-target

En service-target qui a fonctionné pour moi était sous la forme gui/$UID/myPlistFilename

Le nom du fichier plist n'incluait pas l'élément .plist à l'extrémité.

Ainsi, pour le fichier à ~/Library/LaunchAgents/setUserKeyMapping.plist J'ai couru :

launchctl enable gui/$UID/setUserKeyMapping
launchctl kickstart gui/$UID/setUserKeyMapping

Si vous réussissez -kp à la kickstart l'action tue toute instance en cours d'exécution et la redémarre, puis imprime le PID de la nouvelle instance.

launchctl kickstart -kp gui/$UID/setUserKeyMapping

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