script run log job examples agregar linux unix cron sysadmin

log - run cron linux



¿Cómo hago que cron ejecute algo cada "N" en el minuto, donde n% 5== 1? (5)

Sé que puedo hacer que algo funcione cada cinco minutos en cron con una línea como:

*/5 * * * * /my/script

¿Qué sucede si no quiero que se ejecute a las 12:00, 12:05, 12:10, sino a las 12:01, 12:06, 12:11, etc.? Creo 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?


La broma de sean.bright me hizo pensar ... ¿por qué no usar ...

* * * * * /my/script

... y dentro del script haz 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"

... un kludge ... tal vez, pero tan feo como el crontab ... No lo sé.


Usa tu primer horario:

*/5 * * * * /my/script

Y agrégalo al comienzo de tu script:

sleep 60

(Sí, esto es una broma)


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

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


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


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. Usar estos te da una granularidad mayor que segundos junto con muchas 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

editar: este tipo de temporizadores no persistirá durante el reinicio, si desea que se aseguren de generar un archivo de servicio adecuado, con la línea oncalendar correspondiente.