Configurar launchd

3

Tengo una lista de lanzamiento en ~/Library/LaunchAgents diseñada para ejecutar un script ubicado en ~/writout.sh todos los días a las 10:30 AM:

<?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>local.jackson.testwrite.plist</string>
    <key>Program</key>
    <string>/Users/jacksonkearl/writeout.sh</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>10</integer>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</dict>
</plist>

El script es:

#!/bin/bash
echo "it works" >> log.txt

Sin embargo, nada se escribe en el momento deseado.

¿Debo seguir algunos pasos para alertar a launchd del nuevo agente? ¿O de qué otra manera puedo hacer que el proceso comience?

    
pregunta Jackson 28.11.2015 - 16:37

3 respuestas

3

Debe cargar el agente de inicio en launchd.

  1. Terminal abierta
  2. escribe cd ~/Library/LaunchAgents
  3. Escriba launchctl load -w local.jackson.testwrite.plist (asumiendo que ese es el nombre de su archivo plist)

Esto cargará y habilitará persistentemente su plist. Puedes verificar si está cargado con launchctl list

    
respondido por el SJT 28.11.2015 - 17:00
3

Para depurar esto, deseará habilitar la redirección.

<key>StandardErrorPath</key>
<string>/tmp/local.job.err</string>
<key>StandardOutPath</key>
<string>/tmp/local.job.out</string>

También coloqué mi versión de tu script en /usr/local/bin y me aseguré de que fuera ejecutable con chmod a+x

El error que obtengo es:

/usr/local/bin/writeout.sh: line 3: log.txt: Permission denied

Por lo tanto, es posible que desee enviar su comando echo a $TMPDIR u otro lugar que se pueda escribir. Parece que la ruta predeterminada para launchd no es una en la que un usuario pueda escribir (y probablemente por una buena razón).

Pero, hacer launchd / launchctl a mano es difícil. Recomiendo encarecidamente usar una herramienta como LaunchControl o Lingon . Proporcionan la ayuda y la automatización que me hacen mucho mejor en estos scripts.

Usando el control de inicio, rápidamente me permitió recrear su trabajo, tenía todo tipo de sugerencias útiles y, lo más importante, supo sugerir una redirección para depurar la condición de salida / error del script.

Con un solo clic, agregó las líneas anteriores a mi archivo plist y se ofreció a guardarlo y volver a cargar el trabajo para mí.

    
respondido por el bmike 28.11.2015 - 17:03
2

Tienes varios errores en tu archivo plist:

<key>Label</key>
<string>local.jackson.testwrite.plist</string>

se convierte en

<key>Label</key>
<string>local.jackson.testwrite</string>

y al plist le falta un

</plist>

al final. La lista finalmente debería verse así:

<?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>local.jackson.testwrite</string>
    <key>Program</key>
    <string>/Users/jacksonkearl/writeout.sh</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>10</integer>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</dict>
</plist>

Para cargar el LaunchAgent ingrese:

launchctl load /Users/jacksonkearl/Library/LaunchAgents/local.jackson.testwrite.plist

Para cargar el LaunchAgent permanentemente ingrese

launchctl load -w /Users/jacksonkearl/Library/LaunchAgents/local.jackson.testwrite.plist
    
respondido por el klanomath 28.11.2015 - 17:09

Lea otras preguntas en las etiquetas