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
¿ No es StartInterval
la clave para correr periódicamente? En su caso, ¿establecido en 7200 (segundos)?
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
Ruscos
Romeo
Alano
launchd
está 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?Romeo
Alano
KeepAlive
?Alano
Romeo