¿Cómo ejecuto una aplicación usando launchd a intervalos regulares?

Tengo una aplicación que está escrita en lenguaje AppleScripting que verifica si el estado SMART es 'Verificado'; si no lo es, automáticamente me mostrará una alerta de diálogo. Pero necesito que funcione cada 30 minutos. Lo usé cronantes pero nunca funciona con la extensión .app. Entonces, ¿cómo puedo ejecutar la aplicación a intervalos regulares usando launchd?

launchd tampoco funciona con paquetes de aplicaciones (que es solo una carpeta). Siempre debe elegir un/el binario (por ejemplo, /usr/local/sbin/smartmontool o *.app/Contents/MacOS/app_binary)
No es que esté en contra de AppleScript, pero ¿no sería esto mucho, mucho más fácil en bash?
@Allan Eso, en parte, podría depender de qué tan cómodo esté uno escribiendo scripts en bashcomparación con AppleScript. Podría usar una combinación de ambos. bashpara realizar la verificación de estado SMART y AppleScript a través de osascriptpara mostrar un cuadro de diálogo o notificación en el Centro de notificaciones. Pero para eso también do shell scriptestá AppleScript.
@ user3439894 Para obtener ese estado, AS tendría que (como mínimo) emitir un comando de shell en bash de todos modos ( diskutil info diskX | grep -i smart). Esa sería la carne y las papas del guión allí mismo.
En AppleScript, por ejemplo:display dialog "SMART Status: " & (do shell script "diskutil info disk0 | awk '/SMART Status:/{print $3}'") buttons {"OK"} default button 1
En lugar de cerrar esto como demasiado amplio, responderé como si estuviera solicitando herramientas sugeridas para facilitar la depuración de su configuración de lanzamiento. No estoy diciendo que no aprendan launchdy, launchctldado que son muy poderosos, solo que su pregunta podría ser demasiado amplia para una respuesta de dos o tres párrafos. Además, esto no impide que alguien sea amable y haga todo el trabajo por ti.

Respuestas (2)

Úselo oascriptpara llamar a su ApplesScript.

$ oascript foobar.applescript

En su plistdefinición de ProgramArguments para iniciar la aplicación sería la siguiente:

<key>ProgramArguments</key>
    <array>
        <string>osascript</string>
        <string>foobar.applescript</string>
    </array>


Para que su elemento se ejecute, necesita una definición de StartInterval que toma un número entero para la cantidad de segundos (1800 durante 30 minutos) entre ejecuciones.

<key>StartInterval</key>
<integer>1800</integer>


Un plist simple pero funcional se vería de la siguiente manera:

<?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.user.foobar.app</string>
   <key>ProgramArguments</key>
    <array>
        <string>osascript</string>
        <string>foobar.applescript</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>

</dict>
</plist>
No parece funcionar. Estoy usando el archivo .scpt. ¿Me pueden ayudar con un archivo .plist completo?
Consulte esta respuesta para obtener detalles sobre cómo escribir el plist
Sí, gracias, pero quiero que funcione cada hora, no a una hora o día específico. Así que necesito ayuda en esto.
Estoy tratando de reescribir por completo una respuesta que ya existe, pero he puesto las partes más esenciales aquí.
Si el OP realmente tiene una aplicación, ¿por qué no escribir un script de shell que sea básicamente while (true) do open /path/to/foo.app; sleep 1800 done? Podría ser más fácil que el camino hacia abajo convirtiéndolo en un demonio de lanzamiento adecuado o script de tipo de agente o instalando/activandocron
@bmike: más fácil, sí, pero esta es una buena oportunidad para aprender la nueva tecnología

Apple documenta todo lo que necesita para escribir un archivo XML hecho a mano para guardarlo en el sistema de archivos y luego cargarlo, launchtl load /path/to/xmlpero la documentación es muy densa, se supone que tiene varios días o semanas de experiencia y tiempo para aprender.

Recomiendo comenzar con una herramienta como LaunchControl o Lingon para facilitar su curva de aprendizaje y agregar una buena interfaz para elegir tiempos como 30 minutos para el intervalo de repetición en lugar de tener que codificar 1800 segundos en el archivo xml.

Esto es lo que ingresaría para sus 30 minutos y ejecutaría solo cuando el usuario haya iniciado sesión. Restricciones en la aplicación LaunchControl

ingrese la descripción de la imagen aquí

Nuevamente, puede hacer esto a mano, superando todos los obstáculos que enfrentará (errores de depuración para estandarizar y error estándar cuando las cosas no funcionan, permisos de depuración y ubicaciones de carpetas/archivos), pero esa es una pregunta demasiado amplia aquí para obtener alguien de una idea a la implementación de trabajo.

Yo elegiría las herramientas fáciles a menos que desee dominar varias herramientas de secuencias de comandos y el demonio de lanzamiento y el sistema de control bajo el capó.