2011-11-18 16 views
9

Quiero que se ejecute un script cada 40 minutos a partir del minuto 40.
por lo que significa:¿Cómo configuro cron para ejecutar mi script cada 40mins/25mins?

00:40, 01:20, 02:00, 02:40, 03:20... 

Hice, pues, esta entrada a cron:

*/40 * * * * /path/to/script/foo.sh 

Desafortunadamente esto ejecuta el script cada 40 minutos de la hora:

00:40, 01:40, 02:40... 

Lo mismo ocurre con el script que quería ejecutar cada 25 minutos.

Me estoy perdiendo algo aquí?


RESPUESTAS
bien, en caso de que ocurriera a pasar por aquí tienen el mismo problema
aquí es cómo lo resolví:

# 40mins-interval 
40 0 * * * /path/foo.sh   (0) 
0,40 2-22/2 * * * /path/foo.sh (2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22) 
20 1-23/2 * * * /path/foo.sh (1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23) 


# 25mins-interval 
25,50 0 * * * /path/foo.sh    (0) 
0,25,50 5-20/5 * * * /path/foo.sh  (5, 10, 15, 20) 
15,40 1-21/5 * * * /path/foo.sh   (1, 6, 11, 16, 21) 
5,30,55 2-22/5 * * * /path/foo.sh  (2, 7, 12, 17, 22) 
20,45 3-23/5 * * * /path/foo.sh   (3, 8, 13, 18, 23) 
10,35 4-19/5 * * * /path/foo.sh   (4, 9, 14, 19) 

Notas:
1. Habrá todavía ser colisiones en este cronograma (es decir, ver cronogramas que se ejecutan en los minutos 0 y 10 en ambos intervalos).
2. La secuencia de comandos no se ejecutará en un intervalo exacto desde su última ejecución hoy al día siguiente (es decir: el intervalo de 25 minutos finaliza a las 23:45 hoy, comienza a las 00:25 el día siguiente).

+1

leyeron: http://stackoverflow.com/questions/745901/how-to-do-a-cron-job- cada 72 minutos –

+1

Gracias! Esto apesta pero supongo que tendré que hacer la configuración 'manual' de los intervalos como una solución sucia por ahora. – cr8ivecodesmith

+0

Sé que han pasado 4 años, pero puedo tener una solución para el cron de 25 minutos. Puede hacer que el cron se ejecute cada minuto (o cada 5 minutos ...) y su secuencia de comandos detectará si han pasado 25 minutos. Si eso es cierto, entonces su script haría su trabajo. – Kayla

Respuesta

10

Siempre divide la hora actual solamente.

40/40 = 1 por lo que se ejecuta cada 40 minutos de una hora.

*/5 haría 5, 10, 15, 20, ...

Hay que ir para intervalos más grandes.

Do */30 para su intervalo de 25 minutos y cada 60 minutos para su intervalo de 40 minutos.

se establezca lo contrario hasta dos crontabs para su guión:

0,40 */2 * * * /path/to/script/foo.sh 
20 1,3,5,7,11,13,15,17,19,21,23 * * * /path/to/script/foo.sh 
+0

Gracias por la explicación. Sin embargo, cambiar mis intervalos es un no ir. – cr8ivecodesmith

+0

Agregué una solución temporal para el intervalo de 40 minutos. Con poco más trabajo que funcionaría también para el intervalo de 25 minutos. –

+0

Wow esto se ve mucho mejor. ¡Gracias un montón! :) – cr8ivecodesmith

4

Para la tarea que quiere lograr usted tiene que escribir la entrada un poco más complejo en su crontab.

¿Ves el patrón de arriba?

00:40, 01:20, 02:00, 02:40, 03:20 y de nuevo 04:00, 04:40, 05:20, 06:00, 06:40, 07:20, 08 : 00

puedo dividirlo en tres entradas:

  1. Cada incluso horas usted tiene que dejar que funcione a min 40a
  2. Todas las horas impares hay que dejar que funcione a 20 min
  3. Cada incluso hora tienes que ejecutarlo en 0.(Excepto 0 horas)

Esto se puede hacer con más de entradas:

#1 
*/40 0,*/2 * * * /path/to/script/foo.sh 
#2 
*/20 1,*/2 * * * /path/to/script/foo.sh 
#3 
0 2,*/2 * * * /path/to/script/foo.sh 

NOTA: Podría tener problemas menores, pero no me dio la dirección que :)

PD: This will explain alot more

+0

Gracias! Iré con esto por ahora. Es feo, pero necesito arreglarlo de inmediato. – cr8ivecodesmith

0

Necesitará agregar varias entradas para el mismo script a cron, una para ejecutar en la hora, una para veinte pasado y una para tw enty a la hora.

0 0,2,4,6,8,10,12,14,16,18,20,22 * * * script 
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * script 
40 0,2,4,6,8,10,12,14,16,18,20,22 * * * script 

Usted dice que debe comenzar a las 00:40, pero la ejecución del día anterior será a las 23:20. ¿Quieres un espacio de 80 minutos en carreras alrededor de la medianoche?

0
#! /bin/sh 

# Minute Cron 
# Usage: cron-min start 
# Copyright 2014 by Marc Perkel 
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron" 
# Free to use with attribution 

# Run this script under Cron once a minute 

basedir=/etc/cron-min 

if [ $# -gt 0 ] 
then 
    echo 
    echo "cron-min by Marc Perkel" 
    echo 
    echo "This program is used to run all programs in a directory in parallel every X minutes." 
    echo 
    echo "Usage: cron-min" 
    echo 
    echo "The scheduling is done by creating directories with the number of minutes as part of the" 
    echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60." 
    echo 
    echo "Examples:" 
    echo " /etc/cron-min/1  # Executes everything in that directory every 1 minute" 
    echo " /etc/cron-min/5  # Executes everything in that directory every 5 minutes" 
    echo " /etc/cron-min/13  # Executes everything in that directory every 13 minutes" 
    echo " /etc/cron-min/75  # Executes everything in that directory every 75 minutes" 
    echo 
    exit 
fi 

for dir in $basedir/* ; do 
    minutes=${dir##*/} 
    if [ $((($(date +%s)/60) % $minutes)) -eq 0 ] 
    then 
     for program in $basedir/$minutes/* ; do 
    if [ -x $program ] 
    then 
     $program &> /dev/null & 
    fi 
     done 
    fi 
done 
2

Usted puede lograr cualquier frecuencia si se cuentan los minutos (, horas, días o semanas) desde Epoch, agregar una condición a la parte superior de su guión, y establecer la secuencia de comandos para ejecutar cada minuto en su crontab : fecha

#!/bin/bash 

minutesSinceEpoch=$(($(date +'%s/60'))) 

# every 40 minutes 
if [[ $(($minutesSinceEpoch % 40)) -ne 0 ]]; then 
    exit 0 
fi 

date(1) vuelve actual, formato como segundos desde el Epoch (%s) y luego hacer las matemáticas básicas:

# .---------------------- bash command substitution 
# |.--------------------- bash arithmetic expansion 
# || .------------------- bash command substitution 
# || | .---------------- date command 
# || | | .------------ FORMAT argument 
# || | | |  .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command 
# || | | |  | 
# ** * * *  * 
    $(($(date +'%s/60'))) 
# * * --------------- 
# | |  | 
# | |  ·----------- date should result in something like "1438390397/60" 
# | ·-------------------- it gets evaluated as an expression. (the maths) 
# ·---------------------- and we can store it 

Y es posible utilizar este método con, al día, o trabajos de cron mensuales por hora:

#!/bin/bash 
# We can get the 

minutes=$(($(date +'%s/60'))) 
hours=$(($(date +'%s/60/60'))) 
days=$(($(date +'%s/60/60/24'))) 
weeks=$(($(date +'%s/60/60/24/7'))) 

# or even 

moons=$(($(date +'%s/60/60/24/656'))) 

# passed since Epoch and define a frequency 
# let's say, every 7 hours 

if [[ $(($hours % 7)) -ne 0 ]]; then 
    exit 0 
fi 

# and your actual script starts here 
Cuestiones relacionadas