Lanzado ejecutando un Applescript cada dos horas

He escrito un pequeño applescript que me gustaría ejecutar automáticamente cada 2 horas. Por lo tanto, he escrito el siguiente demonio de lanzamiento (probablemente sea 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 la terminal y hecho

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

Funcionó bien, pero solo una vez y no cada dos horas. Al revisar 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 intrínsecamente ineficiente.

16 de diciembre 17:02:25 Air-of-myself-2 com.apple.xpc.launchd[1] (com.zerowidth.launched.aspect): el servicio solo se ejecutó durante 7 segundos. Empujando la reaparición por 7193 segundos.

¿Me pueden ayudar a entender lo que está pasando por favor? ¿Cómo puedo ejecutar el script de Apple cada dos horas?

Gracias.


EDITAR. Añado, siguiendo el consejo de Robert, el script de Python y el de Applescript.

Aquí está el script de Python. Le pide a la consola que ejecute el comando LocateMe y de este obtiene la latitud y longitud del lugar donde estoy. Luego llama a una API para obtener la hora de puesta y salida 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 anterior y lee el valor booleano (si es 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
¿Dónde está su comando de servicio final para que pueda ejecutarse nuevamente?
@Buscar웃 Lo siento pero soy novato con launchd... No estoy seguro de haber entendido tu comentario. ¿Podría ser un poco más explícito, por favor? ¡Muchas gracias por tu amable ayuda!
launchdestá ejecutando correctamente su secuencia de comandos cada dos horas. Sin embargo, parece que su secuencia de comandos se ejecuta continuamente y es ineficiente ejecutar una secuencia de comandos que se ejecuta continuamente en un intervalo establecido. ¿Qué se supone que debe hacer tu guión?
Mmm, ya veo. ¡Gracias por tu respuesta! Mi applescript ejecuta un script de python (!) que básicamente verifica la hora actual y decide si es de día o de noche (dependiendo de mi posición). Luego enciende/apaga Mojave Dark-Mode. ¿Cómo puedo manejar esto de una mejor manera? Tal vez debería establecer una instrucción dentro del Applescript para que no se ejecute continuamente... ¡Gracias!
Suponiendo que su secuencia de comandos de Python se ejecuta, verifica la fecha, hace lo que necesita y luego sale, luego no se ejecuta continuamente (a menos que tenga un error donde está esperando algo). Además, ¿por qué lo ha configurado como verdadero KeepAlive?
Ver esta respuesta y esta respuesta para más detalles.
@Allan Muchas gracias, sus comentarios han sido útiles. En realidad, no estoy seguro de que mi secuencia de comandos de Python "salga": ¿cómo debo hacer eso? Probablemente el problema esté oculto en el hecho de que el AppleScript no termina. ¿Cómo se supone que debo hacerlo? ¿Hay algún comando? [Por cierto, ¿debería publicar todos mis guiones? Todavía no lo he hecho solo porque son bastante largos y también se convertiría en mi pregunta, además del hecho de que los guiones son horribles y solo Dios y yo sabemos lo que queremos decir :-) - pronto solo Dios lo hará :-):- )] ¡Gracias!

Respuestas (2)

¡Fantástico! Funciona exactamente como lo queria, muchas gracias! Por cierto, ¿sabes cuál es la diferencia entre StartInterval y ThrottleInterval? Si ha leído el código anterior, ¿cree que hay una forma más ligera de implementarlo? Muchas gracias, planeo aceptar su respuesta y darle la recompensa (si no aparece otra respuesta mientras tanto). ¡Gracias! :-D
Creo que ThrottleInterval es la frecuencia con la que se permite generar su proceso ; es decir, qué tan pronto se le permitiría funcionar de nuevo. Sin embargo, en realidad no está documentado, por lo que no me metería con eso si no es necesario.

Necesitamos ver todos sus guiones. [ si son breves, o simplemente antes de publicar. ] Puede invocar el script de python desde su plist. Quizás tenga mecanismos de bucle redundantes en sus scripts. Debe poner información de depuración en sus scripts. Escriba en un archivo en su secuencia de comandos applescript y phython. Pon algo como "date >> mylogfile#1" en el script do shell de tu applescript. Comprobando la sintaxis en la 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, puede saber si su script está siendo invocado.

Puedes hacer esto completamente en applescript. Desplácese hacia abajo hasta "Ahora debemos seguir ejecutando este comando periódicamente en segundo plano".

http://scriptingosx.com/tag/stay-open/

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

Roberto

Muchas gracias por tu interés y disculpa la tardanza en responder. Buen punto, con inactivo funciona. Pero, sinceramente, no me gusta demasiado la solución ociosa. Al final es una aplicación que tengo que ejecutar y permanece siempre abierta en segundo plano en el escritorio... en cualquier caso, me gustaría configurarla con launchd para poder aprender algo nuevo. Seguiré tu consejo y pondré todo el script en el OP. Espero que tu puedas ayudarme. Muchas gracias.