La sintaxis que probaste es realmente ambigua. Dependiendo de cuántos días haya en el mes, algunos meses se ejecutarán en días impares y otros en pares. Esto se debe a que la forma en que se calcula toma el número total de posibilidades y las divide. Puede anular este comportamiento extraño al especificar manualmente el rango de días y usar un número impar o par de días. Dado que los scripts de día par nunca se ejecutarían en el día 31 de meses más largos, no pierde nada usando 30 días como base para días pares, y al especificar específicamente dividirlo como si hubiera 31 días, puede forzar impar -Día de ejecución.
La sintaxis se vería así:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Su preocupación acerca de que los meses no tengan la misma cantidad de días no es importante aquí porque no hay meses que tengan MÁS días que este y para el mal mes de febrero, el rango de fechas nunca coincidirá con el último día o dos, pero no hará daño tener En la lista.
El único 'problema' para este enfoque es que si está en un ciclo de días impares, después de los meses con 31 días, su comando también se ejecutará el primero del mes. Del mismo modo, si está forzando un ciclo uniforme, cada año bisiesto causará un ciclo de tres días y el final de febrero. Realmente no puede evitar el hecho de que cualquier patrón regular de "cada dos días" no siempre va a caer en días pares o impares en cada mes y de cualquier manera que lo fuerce, tendrá una carrera adicional o se perderá una carrera entre meses con recuentos de días coincidentes.
0,2,4...,30,32,34
y no importaría, los valores fuera de rango nunca coincidirían.0 0 2-30/2 * * command
0 0 2-30/2 * * command
funciona como se esperaba.Creo que una posibilidad es usar el día del año, como este:
Está probado para sistemas Unix y Linux.
fuente
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Verifiquemos todos los días si es un "otro" :-) (
bc
programa requerido)(No estoy seguro de que el código aparezca correctamente. La
date +%s
parte está entre los apóstrofos posteriores).fuente
En general, lo ejecutaría todos los días y que el script use la lógica para determinar si debería ejecutarse hoy.
Hacer un archivo de estado simple que indique cuándo fue la última ejecución y luego comparar funcionaría muy fácilmente.
Si necesita ejecutarse a través de diferentes fuentes, haga que dependa de argumentos.
fuente