2009-01-22 14 views
42

sé que puedo tener algo pasan cada cinco minutos en cron con una línea como:¿Cómo hago que cron ejecute algo cada "N" en el minuto, donde n% 5 == 1?

*/5 * * * * /my/script 

¿Qué pasa si no quiero hacerlo funcionar a las 12:00, 12:05, 12:10, pero más bien a las 12:01, 12:06, 12:11, etc. Supongo que puedo hacer esto:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /my/script 

... pero eso es feo. ¿Hay una forma más elegante de hacerlo?

Respuesta

74
1-56/5 * * * * /my/script 

Esto debería funcionar en vixiecron, no estoy seguro acerca de otras implementaciones.

+0

La misma sintaxis también es aceptada por fcron, que cubre los dos crones más frecuentes.No creo que dcron apoye esto, pero eso es más raro. – ephemient

+0

esto funciona !! Impresionante ... :) – Mo3z

+0

¿Cómo puedo saber qué versión de cron se está utilizando? –

16

Use su primera lista:

*/5 * * * * /my/script 

y añadir al inicio de la secuencia de comandos:

sleep 60 

(Sí, esto es una broma) broma

+1

De hecho, uso una variación de esto para iniciar un proceso 1 segundo antes de la medianoche. –

+4

Ah, el poder absoluto de dormir -1 ;-) –

+0

Ya estaba moviendo el mouse para rechazar este antes de leer la última línea :) – ymihere

-5

de sean.bright consiguió yo pensando ... ¿por qué no utilizar ...

* * * * * /my/script 

... y dentro de la secuencia de comandos hacer esto ...

#!/bin/bash 
export WHEN=`date '+%M'` 
echo $WHEN 
export DOIT=`echo "$WHEN % 5" | bc` 
echo $DOIT 
if [ $DOIT != 0 ] ; then 
    echo "ha ha ha" 
fi 
echo "done" 

... una chapuza ... tal vez, pero tan feo como el crontab ... No sé.

+0

Porque está ejecutando un proceso cada minuto que sabe que no hará nada útil. Además, creo que su declaración if está rota. ;-) –

+0

Se corrigió la declaración if. – dacracot

+0

Por un lado, eso es mejor. Por otro lado, se está trabajando más para averiguar si debe * no * hacer algo. –

-1

Crearía un nuevo script "delaystart" que toma un período de descanso como primer parámetro y el script para ejecutarse como el resto. Haría que el script verificara la línea de crontab para la línea con el script y solo comenzara el script si la línea no está comentada. Eso lo hace reutilizable, y ps no informará que el script se ejecuta cuando realmente no lo está.

#!/bin/bash 
sleeptime=$1 
sleep ${sleeptime} 
shift 
if (! crontab -l | grep -e '#.+delaystart '${sleeptime} $*) then 
    $* 
fi 
0

Este es un tema bastante antiguo, sin embargo, como ha pasado tanto tiempo, ahora hay algunas otras opciones. Uno de los cuales es no usar cron en absoluto, y usar temporizadores systemd. El uso de estos le da una granularidad más alta que segundos junto con un montón de otras opciones

Más información está disponible aquí https://wiki.archlinux.org/index.php/Systemd/Timers

por ejemplo, para ejecutar un comando adhoc

# systemd-run --on-calendar="*:1/5" /bin/touch /tmp/foo2 
Running timer as unit run-r31335c4878f24f90b02c8ebed319ca60.timer. 
Will run service as unit run-r31335c4878f24f90b02c8ebed319ca60.service. 

# systemctl status run-r31335c4878f24f90b02c8ebed319ca60.timer 
● run-r31335c4878f24f90b02c8ebed319ca60.timer - /bin/touch /tmp/foo2 
    Loaded: loaded 
Transient: yes 
    Drop-In: /run/systemd/system/run-r31335c4878f24f90b02c8ebed319ca60.timer.d 
      └─50-Description.conf, 50-OnCalendar.conf, 50-RemainAfterElapse.conf 
    Active: active (waiting) since Wed 2017-10-25 09:05:13 UTC; 40s ago 

# ls -l /tmp/foo* 
-rw-r--r-- 1 root root 0 Oct 25 09:06 /tmp/foo2 

# sleep 300; ls -l /tmp/foo* 
-rw-r--r-- 1 root root 0 Oct 25 09:11 /tmp/foo2 

# date; ls -l /tmp/foo2 
Wed Oct 25 09:21:42 UTC 2017 
-rw-r--r-- 1 root root 0 Oct 25 09:21 /tmp/foo2 

edición: este tipo de temporizadores suele persistir al reiniciar, si desea que se aseguren de generar un archivo de servicio adecuado, con la línea oncalendar relevante

Cuestiones relacionadas