Cómo hacer un LaunchAgent con StartCalendarInterval

Quiero comenzar a reemplazar crontabs con LaunchAgents. Mi primer intento no funciona.

<?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>Label</key>
    <string>com.nocturnal.mcworldsBackup</string>
    <key>ProgramArguments</key>
    <array>
            <string>~/bin/mcworldsBackup.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
            <key>Hour</key>
            <integer>4</integer>
            <key>Minute</key>
            <integer>30</integer>
    </dict>
</dict>
</plist>

El script mcworldsBackup.sh funciona bien de forma independiente. Lo hice registrar una marca de tiempo en un archivo cada vez que se ejecuta y hasta ahora launchd no lo ha ejecutado ni una sola vez.

Revisé y reparé los permisos de mi disco usando DiskUtility, el plist está en ~/Library/LaunchAgents/com.nocturnal.mcworldsBackup.plist con permisos 0644, al igual que todos los demás archivos .plist que ya están allí. Todos son de mi propiedad: personal.

Si busco mcworldsBackup.sh en /var/log/*, no encuentro nada, ni pistas de por qué no se está ejecutando.

Después de crear el plist por primera vez, cerré sesión y volví a iniciar sesión, también reinicié la computadora varias veces a pesar de que la documentación dice que solo necesita iniciar sesión.

Estoy desconcertado por mis propios problemas de lanzamiento, y una cosa salta a la vista: ¿ha intentado cambiar sus ProgramArguments para usar un nombre de ruta absoluto (vs. relativo)? Un agente de lanzamiento se ejecuta dentro del contexto de un usuario, por lo que debería ser bueno, pero vale la pena intentarlo.
@shanusmagnus Gracias por el consejo, no estaba seguro de qué entorno o operadores de shell se estaban exportando a LaunchAgents, pero anoche intenté especificar la ruta completa al script, así que debería haberse ejecutado esta mañana a las 04:30, ahora son las 09: 50 y nada en el registro. El script está completamente comentado ahora excepto por una sola línea echo $(fecha +%s) >> ~/mcworldsBackup.log

Respuestas (1)

Debe especificar la ruta completa en ProgramArguments. Cosas que su caparazón normalmente expande, como ~y *no son expandidas por launchd.

Después de hacer esos cambios, este LaunchAgent funcionó para mí.

Dijiste que hiciste estos cambios, pero no lo solucionó. Es posible que no haya recargado LaunchAgent después de realizar los cambios.

Solución de problemas de los agentes de lanzamiento

Puede verificar si su LaunchAgent está actualmente cargado ejecutando

launchctl list | grep com.nocturnal.mcworldsBackup

Si no se está ejecutando, puede cargarlo usando

launchctl load ~/Library/LaunchAgents/com.nocturnal.mcworldsBackup.plist

Si realiza algún cambio en el archivo plist, deberá descargarlo usando

luanchctl unload ~/Library/LaunchAgents/com.nocturnal.mcworldsBackup.plist

Luego deberá cargarlo nuevamente, usando el comando de arriba.

Si desea forzar que LaunchAgent se inicie ahora, en lugar de esperar hasta las 4:30, puede ejecutar

launchctl start com.nocturnal.mcworldsBackup

Luego puede enumerarlo usando

launchctl list | grep com.nocturnal.mcworldsBackup

La primera columna del resultado es el PID del proceso, si se está ejecutando actualmente. La segunda columna es el código de salida devuelto la última vez que se ejecutó. Use esto para verificar si funcionó correctamente. Si no, el mensaje de error se escribe en /var/log/system.log.