GNU/Linux >> Tutoriales Linux >  >> Linux

En la forma genérica de Crontab para especificar cada n minutos donde n > 60

Solo necesita hacer los cálculos usted mismo para encontrar los trabajos necesarios para lograr su tiempo.

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

Se puede concluir un algoritmo simple a partir de estos dos ejemplos (cuando se tiene un desplazamiento de 30 minutos):

  • Agregue dos entradas:una con 0 minutos de compensación y otra con 30 minutos de compensación.
  • Especifique el ancho del intervalo de horas igual a duration * 2 .
  • Especifique el desplazamiento de horas:uno comienza con 0 y el otro comienza con la duración después de descartar la parte de 30 minutos.

Si piensas más, puedes encontrar soluciones similares para algo así como cada 75 minutos.

Editar:

Cron no se puede usar para todos los tipos de trabajos programados. Por ejemplo, ejecutar un trabajo una vez al mes el último día del mes. No puedes simplemente hacerlo con cron porque el último día del mes cambia de un mes a otro. Para resolver esto, puede ejecutar un trabajo cron en el rango posible de valores del último día del mes (28-31) y verificar si es realmente el último día o no en el script antes de realizar el trabajo real.


Poner el resultado del comando

date +%s

en una variable en tu crontab. Algo así como HORA=1497950105. Ahora en tu crontab necesitas una entrada como

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever'

Donde segundos es la cantidad de segundos que desea (12600 en su caso).

O si desea esperar 3 horas y 30 minutos después de la finalización del programa

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)'

Editar: Corregí mi respuesta anterior:

  • tienes que escapar del signo % con \, así que %s se convierte en \%s
  • tienes que preceder el comando con /bin/bash -c

Otra solución (sin usar TIME) es:

 * * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever'

Donde minutos es 210 en tu caso.

Edición 2:

Como sugiere MSalters, es mejor ejecutar la entrada cada N minutos, donde N es el máximo común divisor entre 60 y su intervalo de tiempo en minutos


En este caso, creo que simplemente está tratando de usar el cron para hacer algo que no es capaz de hacer por sí mismo (por supuesto, excepto las soluciones en las que cron realmente ejecuta un script de ayuda periódicamente, en cuyo caso diría que no es cron resolviendo el problema por sí mismo).

La solución con el intervalo de 3 horas y 30 minutos no es del todo correcta. Esta fue la solución dada:

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

La razón por la que esto es incorrecto es porque cron ejecutará el trabajo a las 21:00 y a las 00:00, que es un intervalo de 3 horas en lugar de 3 horas y 30 minutos.

Una solución general para todos los intervalos de tiempo tendría que ser capaz de manejar casos que no se dividen uniformemente en 24 horas. Si bien no se divide uniformemente en 24 horas, ¡sí se divide uniformemente en una semana! La forma más fácil de pensar en esto es hacer dos series superpuestas de "cada 7 horas", así:

0 0-23/7 * * 1 whatever
0 4-23/7 * * 2 whatever
0 1-23/7 * * 3 whatever
0 5-23/7 * * 4 whatever
0 2-23/7 * * 5 whatever
0 6-23/7 * * 6 whatever
0 3-23/7 * * 7 whatever
30 3-23/7 * * 1 whatever
30 0-23/7 * * 2 whatever
30 4-23/7 * * 3 whatever
30 1-23/7 * * 4 whatever
30 5-23/7 * * 5 whatever
30 2-23/7 * * 6 whatever
30 6-23/7 * * 7 whatever

Algo que sea divisible por una semana es lo mejor que puedes hacer, porque los meses no se alinean perfectamente con las semanas, y esa es la única forma en que es factible. Por ejemplo, un intervalo de exactamente cada 12 minutos es trivial en una línea de crontab, pero un intervalo de exactamente cada 11 minutos es imposible, porque 10080 no es divisible por 11 (siendo 10080 el número de minutos en una semana).

Definitivamente sería posible escribir un algoritmo para resolver los casos en los que esto es posible, pero claramente no vale mucho la pena, especialmente considerando cómo serían las soluciones.


Linux
  1. ¿Entrada crontab sospechosa que ejecuta 'xribfa4' cada 15 minutos?

  2. Cómo evitar que un usuario no root cree una entrada crontab

  3. El usuario no puede editar crontab, error:"/tmp/crontab.Lm34gsJV:Permiso denegado"

  4. Cualquier forma de especificar la ubicación de los datos del perfil

  5. ¿Hay alguna manera de dejar de escribir 'sudo' para cada pequeña cosa en Linux?

Cómo ejecutar un trabajo Crontab cada semana el domingo

¿Por qué Linux es tan malo y Windows 11 mejor en todos los sentidos?

HDDTemp crontab cada hora en el archivo

Ejemplo de crontab:cada 5 minutos

crontab se ejecuta cada 15 minutos entre ciertas horas

¿Cómo puedo montar una partición en cada reinicio?