¿Cómo puedo hacer que un script se ejecute todos los días en Mac OS X?

Respuestas:

62

Como referencia, las 3 opciones funcionarían. Sin embargo, la opción iCal tiene más limitaciones que las otras.

(Hay GUI para editar cron y launchd como se menciona en otras respuestas)

Cron es el más directo y conocido y hay muchos tutoriales disponibles. Las Notas de Coles son para agregar la última línea desde abajo a su crontab (ya sea editando /etc/crontabo usando crontaben la línea de comando):

MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
MM HH * * * USERNAME /PATH/TO/SCRIPT
00 3 * * * chealion /myscript.sh "Runs at 03:00 every day"

En Mac OS X, en cronrealidad ha sido reemplazado por, launchdpero launchdes compatible con versiones anteriores, cronlo que significa que aún puede usar, cronpero en realidad está launchdhaciendo todo el trabajo.

Si desea usar, launchdtambién querrá consultar otras preguntas aquí en Super User: (por ejemplo, ¿cómo ejecuto un comando launchd como root? ) En cuanto a dónde desea guardar su archivo de configuración (el archivo plist) ya que cuando se ejecuta depende de en qué directorio está almacenado y cómo se carga (por ejemplo, si usó sudo o no), similar a cron.

A continuación, se muestra un ejemplo de la lista de ejecución diaria (asegúrese de que el archivo y la etiqueta sean iguales, menos la lista de la etiqueta): este script se ejecuta todos los días a los 3 minutos después de la medianoche:

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>03</integer>
    </dict>
</dict>
</plist>

También vale la pena señalar que las tareas lanzadas si se programaron para cuando la computadora está dormida o apagada, se ejecutarán cuando la computadora esté disponible nuevamente (encenderla o despertarla), aunque solo una vez, sin importar cuántos días pueda tener estado. Editar: solo estaba en un documento de Apple que decía que si la máquina está apagada, perderá cualquier evento de inicio durante ese tiempo (su script no se iniciará al inicio), (el sueño sí inicia el script al despertar)


Otra opción es usar " at " (consulte la página del manual con "man at"). El script puede reprogramarse con, por ejemplo:

echo "sh $0 $@" | at `date +%H:%M` tomorrow

(use "+ 10 minutos" en lugar de "mañana" para ejecutarlo cada 10 minutos; para detener la programación, simplemente haga "at -l" para enumerar los identificadores de trabajo programados y luego "at -r id " para eliminar el trabajo)

Puede que tenga que iniciar el demonio correspondiente (atrun) primero con (consulte https://superuser.com/a/43680 ):

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

Ventajas: solución rápida, no se necesita acceso a sudo / root, patrones de programación complicados fáciles de hacer Desventaja: no es un método de programación estándar para OS X (que se inicia)

Chealion
fuente
8
Señor, por su archivo de configuración de launchd de ejemplo, podría besarlo . Pero no lo haré.
Paul D. Waite
55
launchdes el camino a seguir en OS X.
zneak
Sí, esa fue mi impresión. Parece que tuvo algunos problemas en Tiger, pero Apple parece haberlo agudizado desde entonces.
Paul D. Waite
En Os 10.7.4 no hay un archivo / etc / crontab. ): Entonces hice 'which crontab' y eso me dio / usr / bin / crontab pero ese es un archivo ilegible.
Hermann Ingjaldsson
@HermannIngjaldsson / usr / bin / crontab es un programa; si lo ejecuta en una Terminal con crontab -e, lo colocará en un editor de texto basado en la terminal en un archivo que se convertirá en su crontab personal cuando lo guarde.
Mark Reed el
8

LaunchControl es otra GUI para launchd / launchctl. Si bien las alternativas mencionadas por otros son perfectamente capaces de lanzar un script a diario, con LaunchControl puede configurar horarios complejos (como "una vez cada día de la semana, los fines de semana cada hora entre las 2 p.m. y las 8 p.m."). También es (AFAIK) la única herramienta que realmente valida el trabajo. Si un trabajo no funciona como se esperaba, le mostrará por qué.

Es gratis probar todo el tiempo que quieras.

Mark Hall
fuente
3
Si bien es gratuito de probar / usar, el desarrollador preferiría que pague por la licencia. sites.fastspring.com/somazone/product/shop
Kent
1
Absolutamente. La razón por la que publiqué esta respuesta en primer lugar fue para apoyar al desarrollador.
Mark Hall el
5

CronniX es una interfaz gráfica de usuario agradable para programar trabajos cron en la Mac ... Bastante decente si no quieres ir y profundizar en la documentación cron.

Zoran
fuente
2
  • Para iCal, es posible que desee leer este artículo .
  • Debería encontrar suficientes tutoriales cronsi lo busca en Google.

Depende de lo que desee: las secuencias de comandos de iCal solo se ejecutarán si está conectado, cronejecuta la secuencia de comandos sin iniciar sesión. No sé si iCal ejecuta una secuencia de comandos si la Mac se apagó en el momento en que la secuencia de comandos debería tener sido ejecutado cronestá haciendo esto

Felix
fuente
2

Una actualización: puede consultar algunas aplicaciones en Mac OS X App Store que hacen esto:

Lingon también parece estar disponible también, dependiendo del sistema operativo que esté ejecutando.

Steve Cooley
fuente
2

Aquí hay una utilidad simple y gratuita para generar XML plist:

http://www.gieson.com/Library/projects/utilities/launcha/

Con esta utilidad no hay necesidad de instalar un programa, solo guarde los resultados en su carpeta Library / LaunchAgents.

mover
fuente
Advertencia: si usa esta herramienta, asegúrese de que RunAtStartesté configurada como falsa (a menos que desee que sea verdadera). Pasé una hora descubriendo por qué mi Finder se congelaría y evitaría que el escritorio se cargara durante el arranque. La desactivación RunAtStartno interfiere con el horario fijo.
Andrea Lazzarotto
1

Siempre uso Lingon para esto, pero parece que está fuera de desarrollo. Podrías probar Crontooie , pero nunca lo he usado personalmente. O simplemente edite el archivo crontab en la terminal.

Josh
fuente
Me parece que Lingon está en desarrollo activo ; la versión actual 3 está disponible en la AppStore junto con la versión anterior 2. Ambas cuestan unos pocos dólares y reciben críticas muy variadas. Personalmente uso Lingon 3 con cierto éxito, pero no lo recomendaría para este propósito sobre otras herramientas mencionadas en otras respuestas (cron, at, etc.).
ssc
La última vez que usé Lingon fue hace más de 2 años. En ese momento funcionó bien para mí, pero no he usado los versons recientes. Lástima que no sea tan confiable como lo era antes.
Josh
0
sp@mactop ~ $ crontab -l
*/5 * * * * /usr/local/bin/cinco.sh
sp@mactop ~ $ cat /usr/local/bin/cinco.sh
#!/bin/sh
....cut....
sp@mactop ~ $ 

... las líneas de comando que agregue para "... cortar ..." se ejecutarán cada cinco minutos.

30 años de progreso, y 'cron' sigue siendo mi programador favorito.

-C

CJ Steele
fuente
0

Si un evento de calendario satisface sus necesidades, la aplicación Automator integrada también le permite crear alarmas de calendario que se activan por eventos de calendario. Puede usar algunas de las acciones integradas basadas en la interfaz de usuario para hacer lo que desee, o también puede hacer que ejecute alguna aplicación o AppleScript, JavaScript o script de shell personalizado.

Brett Zamir
fuente