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.