¿Hay alguna forma de programar la ejecución de CRON?
- sólo durante las semanas 25 - 36 durante el año
- y solo de lunes a viernes (no fines de semana)
Esto se debe a las vacaciones de verano, cuando la gente realiza muchos pedidos de nuestros productos. Es bastante tedioso cambiar la configuración de CRON cada semana. Entiendo que @weekly no se puede combinar con la configuración de estrellas, por lo que algo como lo siguiente no es un marcado válido:
* * 1,2,3,4,5 * * @weekly php /app/cmd import >> /logs/cron-offers.log
Respuesta1
Deberías poder hacer esto de esta manera:
# m h dom mon dow command
* * * * 1-5 /bin/bash -c "if [ `date +%W` -lt 15 ] && [ `date +%W` -gt 11 ]; then php /app/cmd import >> /logs/cron-offers.log; fi"
Coloque el número correcto de semana en el primer y segundo "[]".
Respuesta2
Cron se considera en general un programador muy básico y la sintaxis no permite fácilmente que un administrador formule programaciones un poco menos comunes. Stock cron no tiene un número de semana disponible, por lo que debes ser creativo.
Según ncal -w 2018
las semanas 25-36 es:
May June July August September
Mo 7 14 21 28 4 11 18 25 2 9 16 23 30 6 13 20 27 3
Tu 1 8 15 22 29 5 12 19 26 3 10 17 24 31 7 14 21 28 4
We 2 9 16 23 30 6 13 20 27 4 11 18 25 1 8 15 22 29 5
Th 3 10 17 24 31 7 14 21 28 5 12 19 26 2 9 16 23 30 6
Fr 4 11 18 25 1 8 15 22 29 6 13 20 27 3 10 17 24 31 7
Sa 5 12 19 26 2 9 16 23 30 7 14 21 28 4 11 18 25 1 8
Su 6 13 20 27 3 10 17 24 1 8 15 22 29 5 12 19 26 2 9
18 19 20 21 22 22 23 24 25 26 26 27 28 29 30 31 31 32 33 34 35 35 36
Un enfoque es crear varios lotes que combinados creen el cronograma que desee. Por ejemplo, primero simplemente seleccione los días de la semana de las últimas dos semanas de junio y luego todos los días de la semana de julio y agosto en un segundo trabajo y los primeros días de septiembre como un tercero:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
* * 18,19,20,21,22,25,26,26,28,29 jun * php /app/cmd import >> /logs/cron-offers.log
* * * jul,aug mon,tue,wed,thu,fri php /app/cmd import >> /logs/cron-offers.log
* * 3-7 9 * php /app/cmd import >> /logs/cron-offers.log
Otra opción es simplemente ejecutar su lote diariamente y usar la sintaxis más potente de un lenguaje de programación/scripting adecuado para permitir que el proceso por lotes (es decir, su código PHP) determine si debe ejecutarse o salir inmediatamente.