¿Cómo puedo configurar cron para ejecutar ciertos comandos cada hora y media?

¿Cómo puedo configurar cron para ejecutar ciertos comandos cada hora y media?

Eso no es posible con una sola expresión en cron normal.

Lo mejor que puedes hacer sin modificar el código es:

0 0,3,6,9,12,15,18,21 * * * [cmd]

30 1,4,7,10,13,16,19,22 * * * [cmd]

Estos pueden ser compresibles, dependiendo de la versión de cron que tengas que hacer:

0 */3 * * * [cmd]

30 1-23/3 * * * [cmd]

¿Hay alguna buena razón por la cual no puedes usar 1 hora o 2 horas? Sería más simple seguro.

No lo he intentado personalmente, pero puedes encontrar información aquí para que cron se ejecute cada 90 minutos: http://keithdevens.com/weblog/archive/2004/May/05/cron

Un excert del enlace de arriba:

 0 0,3,6,9,12,15,18,21 * * *  30 1,4,7,10,13,16,19,22 * * *  

Dos líneas en el crontab. En la línea de:

 0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo 30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo 

Podrías hacerlo con dos entradas de crontab. Cada uno corre cada tres horas y se compensan con 90 minutos algo como esto:

0 0,3,6,9,12,15,18,21 * * *

30 1,4,7,10,13,16,19,22 * * *

 #! /bin/sh # Minute Cron # Usage: cron-min start # Copyright 2014 by Marc Perkel # docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron" # Free to use with attribution # Run this script under Cron once a minute basedir=/etc/cron-min if [ $# -gt 0 ] then echo echo "cron-min by Marc Perkel" echo echo "This program is used to run all programs in a directory in parallel every X minutes." echo echo "Usage: cron-min" echo echo "The scheduling is done by creating directories with the number of minutes as part of the" echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60." echo echo "Examples:" echo " /etc/cron-min/1 # Executes everything in that directory every 1 minute" echo " /etc/cron-min/5 # Executes everything in that directory every 5 minutes" echo " /etc/cron-min/13 # Executes everything in that directory every 13 minutes" echo " /etc/cron-min/90 # Executes everything in that directory every 90 minutes" echo exit fi for dir in $basedir/* ; do minutes=${dir##*/} if [ $(( ($(date +%s) / 60) % $minutes )) -eq 0 ] then for program in $basedir/$minutes/* ; do if [ -x $program ] then $program &> /dev/null & fi done fi done 

*/10 * * * * root perl -e 'exit(time()%(90*60)>60)' && command

90 – es una hora y media en minutos

“> 60” – Doy a cron la habilidad de retrasar el inicio del script durante un minuto

También con la ayuda de este hack puedes establecer cualquier periodo con una resolución de minutos

Por ejemplo, inicie el script cada 71 minutos

* * * * * root perl -e 'exit(time()%(71*60)>60)' && command

También puede usar fcron, que también acepta especificaciones de tiempo más complejas, como:

 @ 01h30 my_cmd 

Puede obtener cualquier frecuencia si cuenta los minutos (, horas, días o semanas) desde Época , agrega una condición al principio de su secuencia de comandos y configura la secuencia de comandos para que se ejecute cada minuto en su crontab:

 #!/bin/bash minutesSinceEpoch=$(($(date +'%s / 60'))) # every 90 minutes (one and a half hours) if [[ $(($minutesSinceEpoch % 90)) -ne 0 ]]; then exit 0 fi 

date(1) devuelve la fecha actual, la formateamos como segundos desde Epoch ( %s ) y luego hacemos maths básicos:

 # .---------------------- bash command substitution # |.--------------------- bash arithmetic expansion # || .------------------- bash command substitution # || | .---------------- date command # || | | .------------ FORMAT argument # || | | | .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command # || | | | | # ** * * * * $(($(date +'%s / 60'))) # * * --------------- # | | | # | | ·----------- date should result in something like "1438390397 / 60" # | ·-------------------- it gets evaluated as an expression. (the maths) # ·---------------------- and we can store it 

Y puede usar este enfoque con trabajos cron por hora, por día o por mes:

 #!/bin/bash # We can get the minutes=$(($(date +'%s / 60'))) hours=$(($(date +'%s / 60 / 60'))) days=$(($(date +'%s / 60 / 60 / 24'))) weeks=$(($(date +'%s / 60 / 60 / 24 / 7'))) # or even moons=$(($(date +'%s / 60 / 60 / 24 / 656'))) # passed since Epoch and define a frequency # let's say, every 7 hours if [[ $(($hours % 7)) -ne 0 ]]; then exit 0 fi # and your actual script starts here 

Agregué lo siguiente a mi crontab y está funcionando

 15 */1 * * * root /usr/bin/some_script.sh >> /tmp/something.log