¿Cómo programar un cronjob quincenal?

10

crontab (5) define los siguientes campos:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

y explica:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Por lo tanto, no hay empleos quincenales, en lo que respecta a mi comprensión. Estoy bastante seguro de que hay soluciones, ¿cuáles son las suyas? ¿O me perdí algo?

romano
fuente
2
La mejor respuesta que puedo encontrar sobre esto está aquí: unix.stackexchange.com/questions/1224/…
Somantra
... y esas respuestas en U&L serían la forma en que lo haría, @Somantra :-)
voretaq7
@ voretaq7, habría dicho que era la respuesta canónica, pero no quería parecer pedante ;-)
Somantra

Respuestas:

8

Puede hacer que la cosa sea ejecutada por cron todos los miércoles, luego haga que la cosa ejecute decida si es una semana par o una semana impar. por ejemplo:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
estofado
fuente
Sin embargo, esta es una buena solución, realmente no responde la pregunta en sí misma; prefiero no contaminar la cosa con la lógica del cronograma. Tal vez pueda integrar esto con el enlace que dio @Somantra.
Roman
Muy bien, debo admitir: esta es la mejor solución hasta ahora. El enlace que dio @Somantra logra los mismos resultados innecesariamente complejos en mi humilde opinión (contando con el tiempo UNIX), pero agregar su enfoque directamente al cronjob (en lugar del guión) en el mismo estilo lo hace bastante elegante.
Roman
Esto se rompe en el año 2020 porque tiene 53 semanas. Ej: Si su cron estaba programado para ejecutarse dos veces por semana el 31 de diciembre, se ejecutaría el 31 de diciembre de 2020 (53ª semana) y el 4 de enero de 2020 (1ª semana).
mad_fox
4

Muchos crons (no especificó cuál está usando) admiten rangos. Entonces algo como

0 0 1-7,15-21 * 3

Llegaría el primer y tercer miércoles del mes.

quadruplebucky
fuente
esto es un poco más elegante que el método "hágalo en el script", pero recuerde agregar un comentario a su crontab (regla general: si tiene más de uno -o está /involucrado, probablemente valga la pena comentar para describir el programa)
voretaq7
Sospecho que esto está mal; hará que el trabajo se ejecute del 1 al 7 y del 15 al 21 de cada mes, y también todos los miércoles. Esto proviene de man 5 crontab: " El día de la ejecución de un comando puede especificarse mediante dos campos: día del mes y día de la semana. Si ambos campos están restringidos (es decir, no *), el comando se ejecutará cuando cualquiera de los campos coincida con hora actual. Por ejemplo, "30 4 1,15 * 5" provocaría que un comando se ejecute a las 4:30 am los días 1 y 15 de cada mes, más todos los viernes "(énfasis).
MadHatter
1
En realidad, eso depende de qué cron daemon estés usando. Su entrada parece ser de vixie cron (incluida en las distribuciones de RedHat). Desde "man crontab" en dillo's cron (Slackware): si especifica tanto un día del mes como un día de la semana, * se interpretará como el enésimo día del mes *. Aún así, una solución programada (calculando el número de semana) parece ser la única solución portátil.
AlvaroGMJ
2

Para algo que debe ejecutarse cada dos semanas, use este one-liner:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Este script en particular está programado para ejecutarse los viernes. La semana a ejecutar se puede ajustar usando "-eq 0" o "-eq 1"

AlexY
fuente
1

Anacron es una buena solución para las limitaciones de cron.

  • Anacron tiene un parámetro Período de recurrencia que puede establecer en 14.

comando de identificador de trabajo de retraso de período

14 15 test.daily /path/to/script.sh

Somantra
fuente
Desafortunadamente, anacron no se puede usar. Olvidé mencionar eso.
Roman
1

Si sus necesidades no son literalmente quincenales, simplemente puede ejecutar el cronjob los días 1 y 15 del mes:

15 8 1,15 * * /your/script.sh

Que se ejecuta a las 8:15 am el primer y el quince de cada mes, independientemente del día de la semana.

Chris Brewer
fuente
-2

A partir de esa explicación, la configuración 3/2 en el campo de la semana debería ejecutar la tarea cada dos miércoles, es implícito, pero creo que es factible.

Journeyman Geek
fuente
no, esto es equivalente a for(int i=3; i <=3 ; i+=2) {} ya que solo está pasando por esto una vez, no importa si el "paso" es 1 o 2.
estofado
Lo que dijo @stew. Además, no hay "campo de semana".
Roman
Por campo de la semana, me refiero al "campo del día de la semana"
Journeyman Geek