16 votos

¿Cómo puedo depurar un LaunchAgent de usuario que no parece iniciarse o cargarse con launchctl?

Descripción del problema

La ejecución del siguiente usuario LaunchAgent no muestra un trabajo iniciado, ni el trabajo registra un error o hace algo detectable. Sin embargo, los comandos de Vault incrustados en el archivo plist funcionan bien cuando se ejecutan desde un crontab de usuario o desde la línea de comandos. He ejecutado los siguientes comandos como usuario no 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

La búsqueda en el registro del sistema no muestra nada identificable, ni se crea ningún archivo de registro. Por lo que puedo decir, el trabajo no puede/no quiere iniciarse o ejecutarse, pero no estoy seguro de cómo depurarlo efectivamente.

Contenido del archivo LaunchAgent

Tengo el siguiente archivo almacenado en ~/Library/LaunchAgents con el nombre de archivo local.localhost.RenewVaultToken.plist . El archivo está configurado en modo 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 Puntos 11957

En mi caso, tenía esto (engañoso) Load failed: 5: Input/output error porque el servicio ya estaba cargado. A launchctl unload ~/Library/LaunchAgents/... solucionó esto.

3voto

d5ve Puntos 111

A mí también me pasó y creo que tengo la solución.

He leído a través de la launchctl páginas del hombre y vio que load y start se consideran ahora subcomandos heredados.

Los subcomandos de la implementación anterior de launchd están generalmente disponibles, aunque algunos pueden no estar implementados.

Creo que el comportamiento anterior se puede conseguir con los dos siguientes comandos:

# Enable this plist
launchctl enable service-target

# Run this plist now
launchctl kickstart service-target

El service-target que me funcionó fue en la forma gui/$UID/myPlistFilename

El nombre del archivo plist no incluía el .plist en el extremo.

Así, para el archivo de ~/Library/LaunchAgents/setUserKeyMapping.plist He corrido:

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

Si pasas -kp a la kickstart matará cualquier instancia que se esté ejecutando y la reiniciará, luego imprimirá el PID de la nueva instancia.

launchctl kickstart -kp gui/$UID/setUserKeyMapping

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X