Cronjob se ejecuta cada dos semanas, el sábado, a partir de este sábado

11

Hoy es viernes 3 de octubre de 2014 3:58 a.m.

Quiero programar un cronjob como ese para ejecutarlo en las siguientes fechas:

  1. Sábado 4 de octubre de 2014 8:00 a.m.
  2. Sábado 18 de octubre de 2014 8:00 a.m.
  3. Sábado 1 de noviembre de 2014 8:00 AM ... ...

Entonces, cada 2 semanas, el sábado, a las 8 en punto.

kupa
fuente

Respuestas:

27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: número de semana del año con lunes como primer día de la semana, hoy semana 39

10#$(date +%W): converse el date +Wnúmero decimal y evite la confusión de análisis de base de shell

$((39%2)): operación de módulo: el resultado es 0 (número de semana par) o 1 (número de semana impar), el resultado de esta semana es 1, la próxima semana 0

test 1 -eq 1: prueba aritmética (igual), en este caso el resultado es booleano verdadero

&& yourCommand: Booleano AND: se ejecuta yourCommandsolo si el resultado del comando anterior era verdadero booleano

Tenga en cuenta que el año puede tener dos semanas impares: 53 (este año) y 1 (el próximo año)

Ciro
fuente
2
Eso es elegante! Todavía, como has notado, tiene un caso de esquina el 53º sábado del año, que ocurrirá aproximadamente setenta años en cada cuatro siglos.
MadHatter
@ Cyrus gracias por su respuesta, pero si escribo * * * * 5 test $ (($ (date +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh el script no ejecutar pero si escribo * * * * 5 /u02/restore/scripts/test.sh se ejecuta el script. ¿Por qué tu expresión no funciona? Estaba probando los casos y descubrí que no funcionaba de alguna manera.
Kupa
1
Mi error. Cron interpreta% como nueva línea. Escape ambos% con a \ en su cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus el
Lo sentimos para traer de vuelta esta vieja pregunta, pero que no estaba funcionando para mí y cuando trato de ejecutar $((10#$(date +%W)%2)) -eq 1 && echo OKmis intentos de shell para ejecutar el resultado del cálculo de la semana: -bash: 1: command not found. ¿Alguna pista de por qué está haciendo eso? Gracias.
jhuet
3
@jhuet: testno es usuario, es un comando. Prueba:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

Lo que has mostrado es "todas las semanas". Entonces el código es:

0 8 * * 6

¿Estás seguro de que necesitas ejecutarlo cada dos semanas?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
fuente
1
¿Puede explicar el comando, por favor
Kupa
1
Es mejor usar lo que dio Cyrus: $ (($ (fecha +% W)% 2)) "W" representa un número de semana del año. Comenzando de cero a 53. Si se puede dividir por dos, entonces es su semana "cada segundo". Entonces cronjob se ejecuta todas las semanas, pero el 'expr' ejecuta el comando yourCommand solo si el número de la semana se puede dividir por 2.
Glueon
cuando ejecuto la prueba $ (($ (fecha +% W)% 2)) -eq 1 en la línea de comando no devuelve nada, ¿por qué?
Kupa
1
simplemente ejecute echo $?después de ejecutar ese comando, para ver su código de retorno, eso es lo importante con él
Ale