Cron no se ejecuta en un día específico, pero todos los demás días

8

Tengo una configuración cron para ejecutar un script bash diariamente a las 10 p.m. Tengo otra configuración de cron para ejecutar mensualmente el 1 de cada mes. Ambos cron inician un script bash, y la única diferencia en el script bash es el argumento que pasan al programa java subyacente (emulando el lanzamiento de la línea de comandos del programa java).

El problema es que necesito desactivar de alguna manera el cron diario el 1 de mes para que ambos no intenten ejecutarse el mismo día. ¿Es esto posible hacer automáticamente?

Supongo que puedo crear otro script bash para editar el cron antes del primero y luego nuevamente para configurar las cosas, pero esto parece ... impuro.

SnakeDoc
fuente
no todos los meses tienen 31 días, ¿no sería eso un problema?
SnakeDoc
No
Stéphane Chazelas
una buena alternativa a la solución ofrecida por @suspectus
SnakeDoc
2
o 2-31 para el campo del día del mes.
ceniza
@ash: mira mi respuesta, eso es exactamente lo que sugerí.
slm

Respuestas:

10

De manera similar a la solución propuesta por @StephaneChazelas en los comentarios, puede especificar el rango de días en el tercer campo como un rango para el cron que desea ejecutar todos los días, además del 1 de cada mes.

Las siguientes dos entradas lograrán lo que buscas:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash
slm
fuente
en realidad, no parece funcionar para mí (a menos que esté haciendo algo mal) - el formato en los comentarios es terrible - así que vea mi pastbin por favor por lo que estoy obteniendo: pastebin.com/RKvy5d4e
SnakeDoc
Ups, debería ser 0 22 2-31 * * en tu ejemplo. Lo editaré.
SnakeDoc
1
@SnakeDoc - gracias, todas esas columnas comienzan a mezclarse después de un tiempo 8-)
slm
sí, también los olvido - los configuré, luego olvido cómo lo hice (algo bueno para la página de manual lol)
SnakeDoc
8

La forma más fácil de lidiar con esto es tener una sola entrada cron. Modifique la secuencia de comandos bash para verificar la fecha: si es el primero del mes, llame al programa java con parámetros mensuales, de lo contrario, llame al programa con los parámetros diarios.

Cambiar el script simplifica el proceso ya que el script como documento describirá mejor lo que está sucediendo sin requerir información adicional en una tabla cron.

Los mods de script podrían verse así:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
sospechoso
fuente
1
Terminé yendo con esta solución. Creé otra secuencia de comandos bash con su código de muestra, y cada mes, comenzará la secuencia de comandos bash mensual (que a su vez alimenta el argumento mensual del programa Java subyacente), inicia diariamente la secuencia de comandos diaria, etc.
SnakeDoc
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Creo que usando la comparación de enteros si es más correcto

fecha '+% d' devuelve 01 no 1, por lo que usar == comparación de cadenas será falso

en lugar

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
Wodel
fuente