¿Cómo configuro una tarea para que se ejecute de vez en cuando?

84

¿Cómo puedo ejecutar un script cada, digamos 30 minutos? Supongo que hay diferentes formas para diferentes sistemas operativos. Estoy usando OS X.

stalepretzel
fuente

Respuestas:

136

Solo usa launchd . Es un sistema de inicio muy potente y, mientras tanto, es el sistema de inicio estándar para Mac OS X (la versión actual de OS X ni siquiera arrancaría sin él). Para aquellos que no están familiarizados con launchd(o con OS X en general), que es como un cruce entre init, cron, at, SysVinit ( init.d), inetd, upstarty systemd. Tomando prestados conceptos de todos estos proyectos, pero también ofreciendo cosas que quizás no encuentre en otros lugares.

Cada servicio / tarea es un archivo. La ubicación del archivo depende de las preguntas: "¿Cuándo se supone que se ejecutará este servicio?" y "¿Qué privilegios necesitará el servicio?"

Las tareas del sistema van a

/Library/LaunchDaemons/

si deben ejecutarse, sin importar si algún usuario está conectado al sistema o no. Se iniciarán con privilegios de "root".

Si solo se ejecutan si algún usuario está conectado, van a

/Library/LaunchAgents/

y se ejecutará con los privilegios del usuario que acaba de iniciar sesión.

Si solo se ejecutarán si ha iniciado sesión, van a

~/Library/LaunchAgents/

donde ~ es su directorio HOME. Estas tareas se ejecutarán con sus privilegios, como si las hubiera iniciado usted mismo mediante la línea de comandos o haciendo doble clic en un archivo en el Finder.

Tenga en cuenta que también existe /System/Library/LaunchDaemonsy /System/Library/LaunchAgents, como de costumbre, todo lo que se /Systemencuentra debajo es administrado por OS X. No colocará ningún archivo allí, no deberá cambiar ningún archivo allí, a menos que realmente sepa lo que está haciendo. Jugar en la carpeta de Sistemas puede hacer que su sistema sea inutilizable (póngalo en un estado en el que incluso se niegue a reiniciarse). Estos son los directorios donde Apple coloca las launchdtareas que hacen que su sistema esté en funcionamiento durante el arranque, inician automáticamente los servicios según sea necesario, realizan tareas de mantenimiento del sistema, etc.

Cada launchdtarea hay un archivo en formato plist. Debe tener la notación de nombre de dominio inversa. Por ejemplo, puede nombrar su tarea

com.example.my-fancy-task.plist

Esta lista puede tener varias opciones y configuraciones. Escribir una por mano no es óptimo, es posible que desee obtener la herramienta gratuita Lingon para crear sus tareas. Esta herramienta solía ser gratuita, ahora cuesta $ 5 en la tienda de aplicaciones y $ 10 como la versión que no es de la tienda de aplicaciones (la versión que no es de la tienda de aplicaciones es mucho más poderosa y si ya planea pagar por ella, en serio, obtenga la versión que no es de la tienda de aplicaciones. versión). Si alguien conoce una herramienta comparable que sea gratuita o de código abierto, escríbame en los comentarios y la recomendaré (no quiero publicitar aquí para software comercial).

Solo como ejemplo, podría verse así

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

Este agente ejecutará el script de shell /usr/local/bin/my-script.sh cada 1800 segundos (cada 30 minutos). También puede hacer que la tarea se ejecute en ciertas fechas / horas (básicamente, launchd puede hacer todo lo que cron puede hacer) o incluso puede deshabilitar "OnDemand", lo que hace que launchd mantenga el proceso en ejecución permanente (si se cierra o falla, launchd lo reiniciará inmediatamente) . Incluso puede limitar la cantidad de recursos que puede usar un proceso (como se dijo antes, Lingon muestra todas estas configuraciones en una interfaz de usuario agradable).

Actualización: aunque OnDemandtodavía se admite, está obsoleto. Se nombra la nueva configuración KeepAlive, lo que tiene mucho más sentido. Puede tener un valor booleano, en cuyo caso es exactamente lo contrario de OnDemand(ajuste a falsecomporta como si OnDemandes truey al revés). La gran característica nueva es que también puede tener un valor de diccionario en lugar de uno booleano. Si tiene un valor de diccionario, tiene un par de opciones adicionales que le brindan un control más detallado bajo qué circunstancias se mantendrá viva la tarea. Por ejemplo, solo se mantiene vivo mientras el programa termine con un código de salida de cero, solo mientras exista un determinado archivo / directorio en el disco, solo si otra tarea también está activa, o solo si la red está activa.

También puede habilitar / deshabilitar tareas manualmente a través de la línea de comando:

launchctl <command> <parameter>

El comando puede ser cargar o descargar, para cargar un plist o descargarlo nuevamente, en cuyo caso el parámetro es la ruta al archivo. O el comando puede ser iniciar o detener, para simplemente iniciar o detener dicha tarea, en cuyo caso el parámetro es la etiqueta (com.example.my-fancy-task). También existen otros comandos y opciones.

Consulte la documentación de Apple sobre el formato plist y la launchctlherramienta de línea de comandos (tenga en cuenta que puede seleccionar la versión de OS X en la parte superior, ya que el formato / opciones varían entre las diferentes versiones de OS X)

Mecki
fuente
¿Qué pasa si yo, como usuario, quiero que se ejecute algo incluso cuando no estoy conectado? ¿Es eso posible, o tengo que pedirle al administrador que ponga algo en / Library / LaunchDaemons?
Mark Baker
@Mark: sí, su administrador tendría que hacer esto, y las claves UserName y GroupName tendrían que configurarse apropiadamente en el archivo .plist.
Steve Folly
También tenga en cuenta que para Leopard y más allá, OnDemand está en desuso en favor de la clave KeepAlive. man launchd.plist para obtener más detalles.
Steve Folly
1
LaunchControl soma-zone.com/LaunchControl es muy útil, tiene una prueba ilimitada, por lo que puedo decir, no hay limitaciones frente a la versión con licencia.
BaneOfSerenity
1
@MaciekRek StartCalendarIntervalcon una matriz de dos diccionarios, ambos con la clave Minutey un valor de once 00y once 30harían exactamente lo que solicitó. En el futuro, haga preguntas como preguntas, no como comentarios, luego también puedo mostrarle el diccionario final (no puedo hacer eso en un comentario). Este sitio se trata de hacer preguntas. Si desea insinuar a alguien sobre la pregunta, publique el enlace a la pregunta como comentario, pero no la pregunta en sí.
Mecki
46

puede utilizar el generador plist muy conveniente: http://launched.zerowidth.com/ (no es necesario comprar nada…)

le dará una sola línea de shell para registrar un nuevo trabajo programado con el launchd ya recomendado

Kosmotauro
fuente
11

En MacOSX, tiene al menos las siguientes opciones:

Por experiencia personal, cron es el más confiable. Cuando lo probé, launchd tenía una serie de errores y peculiaridades. Las alarmas de iCal solo se ejecutan cuando está conectado (pero eso puede ser algo que prefiera).

Bruno De Fraine
fuente
8

Como señaló Mecki, launchd sería el camino a seguir. Hay una interfaz GUI para launchd llamada Lingon que es posible que desee consultar, en lugar de editar los archivos de launchd a mano:

Lingon es una interfaz gráfica de usuario para crear una edición de archivos de configuración de lanzamiento para Mac OS X Leopard 10.5.

[recorte...]

Editar un archivo de configuración es más fácil que nunca en esta versión y tiene dos modos diferentes. Modo básico que tiene la configuración más común disponible en una interfaz muy simple y modo experto donde puede agregar todas las configuraciones directamente en el texto o insertarlas a través de un menú.

Arrendajo
fuente
Honestamente, esta es una interfaz excelente y fácil de usar que simplemente lo hace y le permite seguir adelante. Si tiene poco tiempo, este es el camino a seguir.
Joshua Pinter
4

MAC OS tiene una herramienta Automator que es la misma que la del Programador de tareas en Windows. Y al usar Automator, puede programar tareas a diario y vincular la tarea con un evento de calendario recurrente para ejecutar scripts en un tiempo específico diariamente. consulte el enlace para ejecutar scripts a diario en Mac OS

Jlearner
fuente
Al menos en macOS Catalina (10.15.x), no pude encontrar una manera de programar tareas en Calendar a través de Automator. Tuve resultados mucho mejores con Lingon (vea las otras respuestas que mencionan como una interfaz para lanzar).
calvinf
2

Para los scripts de Apple, configuro un calendario iCal especial y utilizo alarmas para ejecutarlos periódicamente. Para las herramientas de línea de comandos, utilizo launchd.

Mike Heinz
fuente
1

FYI: si bien extraño su simplicidad, cron es una cosa del pasado en OS X. Era un perro guardián en Panther. Desde Tiger se ha lanzado. Entonces, si está ejecutando Leopard cron no es una opción.


fuente
0

Puede usar cron para programar tareas.

crontab -e

Un trabajo se especifica en el siguiente formato.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

Ejemplo:

0 12 * * *  cd ~/backupfolder && ./backup.sh

Una vez que haya instalado sus tareas cron, puede usar crontab -l para listar sus tareas.

crontab -l

Si desea saber más sobre las expresiones de programación cron, puede acceder

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

UnchartedWorks
fuente