Launchd ejecutando un Applescript cada dos horas

1

He escrito un pequeño applecript que me gustaría ejecutar automáticamente cada 2 horas. Por lo tanto, he escrito el siguiente demonio de launchd (probablemente es un agente):

<?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>Disabled</key>
        <false/>
        <key>Label</key>
        <string>com.zerowidth.launched.aspect</string>
        <key>Program</key>
        <string>/usr/bin/osascript</string>
        <key>ProgramArguments</key>
        <array>
                <string>osascript</string 
                <string>/Users/***/my_script.scpt</string>
        </array>
        <key>StandardOutPath</key>
        <string>/Users/***/file_log.log</string>
        <key>RunAtLoad</key>
        <true/>
        <key>ThrottleInterval</key>
        <integer>7200</integer>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>

Luego he abierto el terminal y listo

launchctl load ~/Library/LaunchAgents/com.zerowidth.launched.aspect.plist 

Funcionó bien, pero solo una vez y no cada dos horas. Comprobando en la Consola recibí los siguientes mensajes (y muchos más en realidad):

  

com.apple.xpc.launchd [1] (com.zerowidth.launched.aspect): Este servicio   está definido para ejecutarse constantemente y es inherentemente ineficiente.

     

16 de diciembre 17:02:25 aire-de-yo-2 com.apple.xpc.launchd [1]   (com.zerowidth.launched.aspect): el servicio solo se ejecutó durante 7 segundos.   Empujando el respawn hacia fuera por 7193 segundos.

¿Puedes ayudarme a entender lo que está pasando, por favor? ¿Cómo puedo ejecutar el script de Apple cada dos horas?

Gracias.

EDITAR. Agrego, siguiendo el consejo de Robert, el script de Python y el Applescript.

Aquí está la secuencia de comandos de Python. Le pide a la consola que ejecute el comando LocateMe y de esto obtiene la latitud y la longitud del lugar donde estoy. Luego llama a una API para obtener la hora de salida y puesta del sol de este lugar. Finalmente, una pequeña función decide si es de día (amanecer < ahora

output = os.popen('/Users/***/Desktop/LocateMe').read()
###I extract my coordinates 
coord = output[1:25]
lat = float(coord[1:12]) ###latitude
long = float(coord[13:25]) ### longitude

my_sunrise, my_sunset = get_ris_and_set(lat, long) ##this function calls an API that gives sunset and sunrise time in the position given by (lat,long)
my_sunset1 = my_sunset.time()
my_sunrise1 = my_sunrise.time()

result = str(is_day(now.time(), my_sunrise1, my_sunset1))
### compare the time now and returns true if it is day false otherwise    
with open('/Users/***/Desktop/log_file.txt', 'a') as f:
        print(result, file=f)
sys.exit()

Aquí está el Applescript: ejecuta el script de Python arriba y lee el valor booleano (si es de día o no). Luego verifica si el modo oscuro en Mojave está activado y cambia si es necesario.

tell application id "com.apple.systemevents"
tell application "Terminal"
    do shell script "/usr/local/bin/python3 /Users/***/Desktop/python.py $@"
end tell

tell appearance preferences
    set value to do shell script "tail -n 1 /Users/***/Desktop/log_file.txt"
    if dark mode is true and value = "True" then
        set dark mode to false
    else if dark mode is false and value = "False" then
        set dark mode to true
    else
        return
    end if
end tell
end tell
    
pregunta Romeo 16.12.2018 - 17:12

2 respuestas

2

¿No es StartInterval la clave para ejecutar periódicamente? En su caso, ¿establecer en 7200 (segundos)?

enlace

    
respondido por el Geoff Nixon 22.12.2018 - 13:18
1

Necesitamos ver todos tus scripts. [Si son cortos, o simplemente antes de publicar. ] Podrías invocar el script de python desde tu lista. Quizás tenga mecanismos de bucle redundantes en sus scripts. Deberías poner información de depuración en tus scripts. Escriba a un archivo en su script de Applecript y Phython. Ponga algo como "date > > mylogfile # 1" en el script do shell de su Applecript. Comprobando la sintaxis en el terminal:

mac $ date >> mylogfile#1
mac $ date >> mylogfile#1
mac $ date >> mylogfile#1
mac $ cat mylogfile#1 
Sun Dec 16 19:32:17 EST 2018
Sun Dec 16 19:32:21 EST 2018
Sun Dec 16 19:32:23 EST 2018

un poco más de peso podría ser útil. De esta manera puedes saber si tu script está siendo invocado.

Puedes hacerlo completamente en Applecript. Desplácese hasta "Ahora debemos seguir ejecutando este comando periódicamente en segundo plano".

enlace

observe cómo la rutina inactiva devuelve el tiempo después del cual se invocará nuevamente el controlador de inactividad.

Robert

    
respondido por el historystamp 17.12.2018 - 01:36

Lea otras preguntas en las etiquetas