martes, septiembre 24, 2013

Cuando se restringen los campos para los días en la crontab

Hay dos campos para indicar el dia en la crontab, uno que es el día del mes (tercer campo) y otro que es el día de la semana (quinto campo). Estos campos tienen un comportamiento diferente si se indica '*' o se pone un rango, es decir, si se restringen ambos.

Por ejemplo:
  • 59 15 * 2 1-5 usuario comando
  • 59 15 1-15 2 * usuario comando
  • 59 15 1-15 2 1-5 usuario comando
El primer comando se ejecuta de lunes a viernes durante el mes de febrero a las 15:59. El segundo comando se ejecuta del 1 al 15 del mes de febrero a las 15:59. El tercer comando pudiera entenderse que se ejecuta de lunes a viernes durante la primera quincena del mes de febrero, pero no es asi. En realidad se ejecuta del durante la primera quincena de febrero a las 15:59 y además (aquí viene la sorpresa), de lunes a viernes durante el mes de febrero.

En el propio manual de la crontab lo indican con una breve nota, pero nunca me fijé en ella :-(
Note: The day of a command's execution can be specified by two fields — day  of  month, and day of week.  If both fields are restricted (i.e., aren't *), the command will be run when either field matches  the  current time. 
Con lo que en principio no es posible decir en la crontab que un comando se ejecute unos X días de la semana durante Y días del mes. Pero hay truco, es posible hacerlo modificando la invocación del comando con un condicional de la shell para que haga una comprobación de fechas y luego ejecute el comando con el operador &&, aunque tan elegante no queda.
  • 59 15 * 2 1-5 usuario [ $(date +%d) -le 15 ]  && comando
Esto si que se ejecutaría de lunes a viernes durante la primera quincena del mes de febrero a las 15:59.

No hay comentarios:

Publicar un comentario