¿Cómo puedo escribir un cron que excluya una fecha específica?
digamos: necesito ejecutar un crontab de 6:00 p. m. a 9:00 p. m. cada 30 minutos los fines de semana y quiero excluir solo el 10 de mayo de 2014.
¿Es posible? ¿Cómo puedo escribir esto? ¿O hay alguna alternativa para esto? Por favor recomiende.
Respuesta1
La sintaxis cron estándar es bastante simple y no admite exclusiones. En algunos casos, es posible crear una lista de varias entradas cron para implementar dicha lógica, pero eso tiende a ser tedioso y difícil de entender o mantener; Sin embargo, este enfoque no es aplicable en su caso (sobre todo porque el cron estándar no tiene noción del año calendario).
No es un gran plan complicar los comandos cron, pero puedes hacerlo con algo relativamente sencillo como:
0,30 18-20 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
0 21 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
(Con " 0,30 18-21
" la tarea también se ejecutará a las 21:30; necesita la segunda línea si desea ejecutarla también a las 21:00, si no, omítala)
NOTA: Enalgunos crontabsdebe escapar de los signos de porcentaje (se utilizan para indicar nuevas líneas cuando se introducen datos en línea en la entrada estándar del comando), aunque no en el cron de Dillon.
El comando cron es realmente un shelllista de comandos, el ||
operador de control proporcionaevaluación de cortocircuitode comandos. Los comandos de la lista se intentan uno a la vez, de izquierda a derecha, pero la ejecución se detiene cuando el primero devuelve verdadero. Si la comparación de cadenas de fecha devuelve verdadero (solo verdadero por un día) mycommand
no se ejecuta, cuando la comparación de fechas devuelve falso mycommand
se ejecuta.
Sin embargo, tenga en cuenta que muchas cosas pueden diferir en la forma en que cron inicia los programas. El enfoque más sólido es utilizar un script contenedor para implementar su lógica condicional.
Respuesta2
Puede utilizar X-Y
para intervalos de tiempo y */Z
para frecuencias. Dónde:
X
es el inicio del intervalo.Y
es el final del intervalo.Z
es solo un divisor (es decir: cada unoZ
).
Para excluir una fecha, simplemente crearía mi propio guión. Dentro de este script, verifique la fecha y luego decida si desea ejecutar las siguientes instrucciones.